그림 34-9를 다시 참고하세요. 그림에서 화살표가 네모 상자에 있으면 메모리 주소에 접근한다는 뜻입니다.
int *numPtr로 선언했고, 예제 코드에서는
numPtr = &num1;
로 대입했습니다. 이걸 설명한 그림입니다.
따라서 numPtr은 pointer to int이고, 이건 int num1로 선언한 변수 num1이 있는 메모리 주소를 가리킵니다.
&num1은 num1의 주소입니다. address of int라고 읽지요.
그러나 &num1은 num1의 메모리 주소, 즉 네모 상자만 가리키는 겁니다.
그리고 그 안에 있는 값은 int num1로 선언한 변수 num1에 있고,
*numPtr처럼 pointer to int에서 pointer to를 제거하면 남는 int, 흔히 말하는 역참조입니다.
num1과 *numPtr은 int 값이라는 의미입니다.
위에 코드를 설명하기 위해 그린 그림입니다.
int *numPtr로 선언했으니까 pointer to int라고 읽고, 이 포인터는 int 값이 저장된 메모리, 네모 상자에 접근하는 것이고,
*numPtr처럼 역참조하면 int 값에 접근하는 것이라는 의미입니다.
예제 코드 주석에 자료형이 일치한다고 써놨습니다.
pointer to int == address of int, 자료형이 일치한다는 뜻이고
오른쪽은 int이니 자료형이 일치한다는 뜻입니다.
num1 == *numPtr, 자료형이 int로 일치한다는 뜻입니다.
C 언어에서는 자료형을 정확하게 읽는 법만 배우면 되고, 이 자료형이 일치하게 해주면 됩니다. C 언어는 자료형이 일치하지 않아도 경고만 표시하고 일단 컴파일이 되고 돌아가게는 만들지만, 올바른 코드는 아닙니다. 현대 언어는 자료형이 일치하지 않으면 컴파일 에러로 처리하고 컴파일이 안 되는데, C 언어는 과거에 만들어진 언어라 이런 부분에서 관대합니다. 그래서 이게 된다고 C 언어 표준에서 허용한 것도 아닙니다. C 언어 표준은 훨씬 나중에 만들어졌습니다.
때문에 많은 교수, 저자들이 C 언어로 이런 코드도 동작한다! -> 자기 해석을 덧붙임 -> 이상한 썰을 푼다... 같은 경우가 많습니다.
경고가 발생하면 에러로 간주하고 경고가 발생하지 않게 코드를 작성하는 게 중요합니다.