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)만 달랑 써 넣고
너가 주소 알아서 찾아가서 홍길동 찾아. 하는 것과 같습니다.
강원도 사는 홍길동인지 어찌 알겠습니까.
심사문제는 주소 찾아가라는 것이지 '홍길동' 쓰는 문제가 아닙니다.