본문 바로가기

공부기록/C, C++

[C] 이중포인터의 선언, 할당, 참조 이해하기

C 포인터의 이해와 활용이라는 책에서 나온 내용이다.

이중포인터를 선언하고 할당하고, 참조하는 것들이 헷갈렸는데 이 내용이 좋은 예시인 것 같다.

 

먼저 전체 책 제목을 포함하는 문자열 배열을 선언한다.


char *titles[] = {"A Tale of Two Cities",
               "Wuthering Heights", "Don Quixote",
               "Odyssey", "Moby-Dick", "Hamlet",
               "Gulliver's Travels"};
               

titles 는 'char* 변수를 담는 배열' 이다.

 

현재 배열이 선언된 상태를 그림으로 보면 다음과 같다.

예를 들어, titles[0] 의 주소는 0x100 이며, titles[0]은 0x200 이라는 주소를 가리킨다.

주소 0x200은 문자열 "A Tale of Two Cities"의 첫번째 글자인 'A'를 담고 있다고 볼 수 있다.

책에는 titles의 주소가 4byte씩 증가하지만, 요즘은 다 64bit 컴퓨터니까 8byte 씩 증가하게 그려봤다.

각각의 주소값을 출력해보면 이해가 빠를 수 있다.

printf("%p\n", titles[0]);		//0x200 출력
printf("%p\n", &titles[0][1]);		//0x201 출력
printf("%p\n", &titles[0]);		//0x100 출력
printf("%p\n", &titles[1]);		//0x108 출력

 

그럼 이제, 전체 책 목록에서 '가장 잘 팔리는 책 TOP3' 목록을 만들어보자.

 

잘 팔리는 책을 뽑아서 복사해서 새로운 배열을 만드는게 아니라, title에서 책들의 주소를 가져와 참조할 것이다.

그렇다면, 이 배열은 char 포인터(char *) 를 가리키는 포인터(*)가 되어야 한다.

만약 책 제목이 변경되어야 할 때, 한 군데만 변경하면 모두 변경될 것이다.

// 선언
char **bestBooks[3];

// 할당
bestBooks[0] = &titles[0];
bestBooks[1] = &titles[3];
bestBooks[2] = &titles[4];

bestBooks는 'char*형을 가리키는 포인터를 담은, 크기가 3인 배열'이 되는 셈이다.

뒤에서부터 해석하면 편하다고 한다.

bestBooks[3] : 크기가 3인 배열 bestBooks

*bestBooks[3] : 포인터 변수를 담은 크기가 3인 배열 bestBooks

**bestBooks[3]: 포인터 변수를 가리키는 포인터 변수를 담은 배열 bestBooks

char **bestBooks[3]: char *형 변수를 가리키는 포인터변수를 담은 배열 bestBooks

 

최종적인 메모리 구성은 다음과 같다.

 

내가 짜려는 코드에 맞게 간접참조를 막 이용하려면 또 머리가 깨지겠지만, 이렇게 좋은 예시를 남겨놓으면 도움이 되겠지...