Open
Description
9-3 퀴즈에서 char *p[10]
은 올바르지 않고 char **q[10]
는 올바른 이유에 대해 질문이 있었습니다. 좋은 질문이라 공유합니다.
char *p[10]
은 포인터의 배열이고
char **q[10]
은 포인터의 포인터의 배열이므로 즉 겉보기에는 그냥 둘다 배열입니다.
그러나 이 경우에 tptr = &p;
는 포인터에서 포인터로 가는 assignment 인 반면,
tptr = q;
는 배열에서 포인터로 가는 assignment 입니다. 따라서 각각 다른 규칙의 적용을 받습니다.
<tptr = &p;
>
포인터에서 포인터로 가는 assignment는 (double* dp 를 char* cp
로 지정하면 안되듯이) 내용 타입이 반드시 같아야합니다.
&p
는 "배열"의 포인터이고 tptr
은 "포인터"의 포인터이므로, 즉 내용타입이 달라서 안맞습니다.
<tptr = q;
>
(동일한 내용 타입의) 배열을 (동일한 내용 타입의) 포인터에 지정하는 것은 char a[10]; char * p = a;
처럼 가능합니다. 이에 따라 tptr = q
는 char**
의 배열을 char**
의 포인터에 지정하고 있으므로 내용 타입이 같아서 문제가 없이 잘 동작합니다.