[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'를 담고 있다고 볼 수 있다.
각각의 주소값을 출력해보면 이해가 빠를 수 있다.
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
최종적인 메모리 구성은 다음과 같다.
내가 짜려는 코드에 맞게 간접참조를 막 이용하려면 또 머리가 깨지겠지만, 이렇게 좋은 예시를 남겨놓으면 도움이 되겠지...