본문 바로가기

Programming/C language

chapter 11. 메모리와 포인터 (내용요약 - 3)

Pointer의 배열 & 다중 포인터 


포인터 배열 


포인터 변수의 내용이 포인터인 배열 


ex) 

char* apList[3] = {"Hello", "World", "String"};


해석 방법 

1. 배열 3개를 가진 변수 apList가 존재한다. 

2. apList의 각각 요소는 char * 형이다. 


apList : char **  - char *를 저장하는 포인터니까

apList[1] : char *  - char *를 저장하는 포인터의 두번 째 인덱스에 들어있는 값이니까 



char형 변수에 대한 포인터 : char *

char* 형 변수에 대한 포인터 : char ** 



다중 포인터


포인터 변수도 결국은 변수다.

즉 포인터 변수도 주소를 가지고 있고, 그 주소를 다른 포인터 변수에 저장할 수 있다. 


포인터 변수 자체의 주소와 포인터 변수가 담고있는 주소를 구분하는 것이 중요하다. 


ex) 

char ch = 'A';

char *pData = &ch;

char* *ppData = &pData;


(char* *ppData, char** ppData, char **ppData 모두 동일한 것이다. 해석의 편의를 위해 위와 같이 적었다.) 


해석 방법 (char* *ppData = &pData) 

1. 포인터형 변수 ppData가 존재한다. 

2. 이 포인터형 변수에 들어가는 것은 char* 형 변수의 주소이다. 

- 그렇기에 char *형인 pData의 주소(&pData)를 대입한 것이다. 



포인터 배열과 다중 포인터의 조합 


char* astList[3] = { "Hello", "World", "String" };

char* *ppstrList = astList;

char** *pppstrList = &ppstrList;


ppstrList 는 char*형 포인터 변수의 주소를 저장할 수 있다. 

-> astList의 요소가 char* 이므로 astList는 char*를 내용으로 가지는 포인터 변수(배열)의 주소가 된다.



다차원 배열에 대한 포인터


다차원 배열 : 배열의 배열 ( 배열 : 같은 형식의 자료가 여러개 있는 것 )


char[3][12] : char[12]인 요소가 3개 있는 다차원 배열 

이를 포인터에 넣을 때에는 char (*~)[12] 를 사용한다. 


주의) char* *ppList = ~ 로 하면 문제가 생기는데, 그 이유는 char* *ppList 에는 요소가 char*인 배열의 주소가 들어가야 하는데, 

char[3][12] 는 요소가 char[12] 이기 때문이다.  






- 출처 : 독하게 시작하는 C 프로그래밍 (최호성, 루비 페이퍼)