흠.. 오늘 포인터의 포인터 에 대한 예제가 오류를 발생하면서 실행이 되지 않았는데요.

그때문에 민망하기도 했고..

헌데 집에 와서 검토를 해본 결과.. 제가 배운 혹은 이해한 내용과는 상이한 내용인지라서...

수십 번이나 찍어서 발행된 책에 제가 딴지를 걸만큼 알고 있다고는 생각되지 않지만

제가 생각한 가설이 더 맞는 것 같아서  어떤게 맞는 지 문의하기 위해서 적어봅니다.


감히 저자가 '포인터의 포인터'와 '포인터 배열'을 잘못 이해하고 있는 것이 아닌 지에

관한 내용입니다. ( 부디 그게 아니라고 제 오해(?)를 풀 수 있을 답변을 기다려요. )



우선 저희 교제에 '포인터의 포인터.' 챕터에 있는 해당 예제입니다.

char **strarray =
{
"Cat",
"Dog",
"Lion",
"Rat"
};


제 생각에는 저 예제는 포인터 배열에 관한 예제가 아닌가 생각합니다.

찾아보니 책에 포인터 배열에 관한 챕터는 없더군요.

그리고 해당 소스는 VC++ , 터보C++ , 터보C 에서 안돌아갑니다.

처음에 VC++ 에서 안돌아갔을때.. C 컴파일러가 아니라서 일지도 모른다고 하셨지만..

제가 알기론 C++ 컴파일러가 C에 대한 하위 호환성을 갖추고 있다고 알고 있거든요.

그래서 터보C로 확인을 해달라고 부탁했더니.. 거기서도 역시 안된다고 하더군요.


저 소스가 포인터 배열에 관한 예제라면 다음과 같이 바뀌어야 합니다.

char *strarray[] =
{
"Cat",
"Dog",
"Lion",
"Rat"
};


둘째.. '포인터의 포인터'에 관한 예제라면 다음과 같아야한다고 생각합니다.

char str[80], *p **p;

p = str;

pp = &p;


이유는 1. 포인터는 선언을 할때 자신이 가지고 있을 변수의 데이터형을 적습니다.

int* p; 라던지 말이죠. 이때 *p는 정수형 변수하고만 연결합니다.

포인터에 대한 포인터라면.. char에 대한 배열이 아닌 포인터의 주소를 얻는 것이 맞다고 생각합니다.

2. 포인터는 한가지 배열 혹은 변수에 대한 주소를 갖습니다.

단 하나의 포인터가 동시에 여러 변수의 주소를 갖고 있는 경우는 보지도 못했고 상상도 안갑니다.

때문에 결론은.. '포인터의 포인터'도 '하나의 포인터의' 주소만을 갖을 수 있다고 생각합니다.


마무리.

제가 생각하는 '포인터의 포인터'의 용도는.. 책에서 적힌 것과 같이 들쭉날쭉한(ragged) 모양의

(문자열) 배열을 만듬으로서 효율적인 메모리 관리를 하는 것이 아니라고 봅니다.

그건 오히려 '포인터 배열'에 대한 용도가 아닌 가 생각합니다.

'포인터의 포인터'는 '함수 포인터'나 'void 포인터'의 용도처럼 컴파일시에 결정되지 않고

실행되는 동안의 상황에 따라서 대응을 해나가는 데 사용된다고 봅니다.

'함수 포인터'가 해당 상황에 맞는 함수로 대응하기 위한.. 'void 포인터'가 주어진 데이터형에 맞게

대응하기 위한 것처럼 '포인터의 포인터'는 해당 상황에 맞는 데이터로 대응하기 위한 용도라고

생각합니다.



아무튼 저는 저렇게 배웠기 때문에 해당 교제의 내용에 몬가 이건 아니다라고 생각되는 군요.

제가 잘 못 이해한 것인지 어떤지에 대해서 도움을 부탁드립니다.