C/C++
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]과 같기 때문입니다.