C언어를 어렵게 한다는 포인터, 쉽게 생각하기 위해 배열과 같다는 것으로 이해하는 분이 있습니다만,

아마도 그것은 포인터나 배열을 비슷한 방법을 사용할 수 있는 C언어 코드의 특성 때문일 것입니다.


    char  array[] = "falinux.com";

    char *ptr = "badayak.com";


    printf( "%c %c\n", array[3], *(array+3));

    printf( "%c %c\n", *(ptr+3), ptr[3]);


이런 식으로 사용할 수 있기 때문이죠. 이는 포인터의 *나 배열의 []가 연산자이기 때문입니다.

그러나 포인터와 배열에는 큰 차이가 있습니다. 그 중 하나가 포인터 변수는 선언된 변수가 차지하는

메모리가 있습니다. 배열에는 없죠.


즉, ptr 변수에는 주소 값을 갖기 위한 메모리 영역이 있습니다.

그러므로 아래와 같은 코드가 가능합니다.


   ptr= 3456;


당연하지요. 그러나 배열은 메모리 공간을 할당받지 못합니다.

즉, array[0], array[1], ... 은 있어도 array 자체는 없습니다.

그래서 포인터처럼 아래와 같은 코드는 불가합니다.


   array = 3456;


그렇다면 배열의 주소를 구하려면 어떻게 해야 할까요?


   ptr = array;  or ptr = &array;


답은 ptr = array 입니다. 다시 말씀 드리지만, 배열 변수 array 자체에 대한 메모리 할당은 없습니다.

메모리 할당이 안 되어 있는데 주소가 있을 수 없지요. 그래서 ptr = &array는 성립할 수 없습니다.

그렇다면? 배열 요소를 직접 지정해 주어야 합니다.


   ptr = &array[0];


이해되시죠? 배열 변수 array를 위한 메모리 할당은 없고 array[0], array[1], array[2], ....는

당연히 있기 때문에 메모리에 할당된 주소를 포인터 변수에 넣을 수 있습니다.


그렇다면 ptr = array는 어떻게 가능할까요? 이는 array 자체가 배열의 시작 부분을 가르키기 때문에

&array[0]과 같기 때문입니다.