아래와 같이 코드를 작성하여 심사문제를 통과했습니다.
numPtr1 = &num1;
numPtr2 = &numPtr1;
그리고 다시 아래와 같이 시도해보았는데, 이번에는 통과되지 않았습니다.
*numPtr1 = num1;
*numPtr2 = numPtr1;
제 예상으로는 int 포인터 numPtr1 역참조에 num1의 값이 할당되어 num1의 값이 저장된 메모리주소와 numPtr1 값이 같아지고, 다시 numPtr1 포인터값이 int 이중포인터 numPtr2의 역참조에 할당되어 numPtr1 포인터값이 저장된 메모리주소와 numPtr2의 값이 같아질 것 같았습니다.
단순하게는 34.2에서 *numPtr = num1과 numPtr1 = &num1을 비슷하게 소개한 걸 생각해서 저렇게 한 건데, 왜 작동하지 않는 건가요?
int *numPtr1 = NULL;
int **numPtr2 = NULL;
int num1 =0;
scanf("%d", &num1);
*numPtr1 = num1;
*numPtr2 = numPtr1;
이건 포인터 연습을 위해 임의로 만든 예제이고,
포인터에 값을 담을 수 있게 malloc으로 메모리를 할당한 것도 아닙니다.
주솟값만 담아야 합니다.
*numPtr1 = num1로 하면 둘 다 int, int이니까 type match이지만,
*numPtr1에는 주솟값만 담아야 합니다. 역참조해서 정수를 담을 수 없습니다.
이유는? 역참조했으면 해당 공간이 있어야 하죠? pointer to int 자체는 주솟값이고, 그 주솟값에 공간이 있어야 합니다. 메모리가 있어야 하죠. 메모리가 할당된 것은 무엇이 있나요? 값을 실제로 저장하고 있는 건?
현재 이 코드에서는 int num1뿐입니다. 이 변수만 유일하게 정숫값을 담을 수 있는 공간이 있습니다.
pointer to int인 numPtr1은 num1을 가리키는 것만 가능합니다. 주솟값만 가능합니다.
따라서 numPtr1 = &num1처럼 주솟값만 저장해야 합니다.
num1에 입력을 10이라고 했다면 num1은 10이고,
*numPtr1 = num1은 *numPtr1이 어디를 가리키는지는 몰라도 값을 10으로 강제로 넣었다는 뜻이죠. 하지만 주소로만 해석될 것이니 주소 10을 가리키는 거고, 거기에 어떤 값이 있는지는 모릅니다.
int *numPtr1을 선언한 상태에서 numPtr1에는 쓰레기 값이 들어 있고, *numPtr1이라고 역참조하면 쓰레기 값이 들어 있는 주소를 역참조해서 거기에 있는 값을 읽을 뿐이죠. 이는 잘못된 메모리 접근이니 보통은 access violation에 해당합니다.
numPtr2처럼 pointer to pointer to int라면 역참조를 2번해서 num1이 저장된 int 값에 접근할 수 있는 메모리 주소만 저장하고 있어야 합니다.
어쨌든 첫 번째 줄부터 틀렸으니 동작하지 않습니다.
서울시 여의도동.... 홍길동
이렇게 있다면 주소가 있어야 홍길동 찾아갈 수 있는데
편지봉투 줬더니(numPtr1) 편지봉투에 홍길동(num1)만 달랑 써 넣고
너가 주소 알아서 찾아가서 홍길동 찾아. 하는 것과 같습니다.
강원도 사는 홍길동인지 어찌 알겠습니까.
심사문제는 주소 찾아가라는 것이지 '홍길동' 쓰는 문제가 아닙니다.