배열포인터
포인터 배열은 말 그대로 포인터로 이루어진 배열이다.
앞서 포스팅한 배열 포인터와는 이름부터가 다르다.
int a[3][5];
int b[6];
int* p = b;
b[0]의 주소값을 100이라고 한다면, b = 100, b + 1 = 104이다.
마찬가지로, p = 100, p + 1 = 104이다.
이는 앞서 포스팅한 내용과 같다. 왜? 배열로 이루어진 포인터니까.
여기서 볼 것은 a와 같이 선언된 배열이다.
p = a라는 선언이 될까?
된다면 좋겠지만 선언은
int (*p)[5] = a;
라고 선언해야한다.
그 이유는 아래와 같다.
a의 주소값을 200이라고 한다면,
a = 200, a + 1 = 220, a + 2 = 240이 된다.
200 | 204 | 208 | 212 | 216 |
220 | 224 | 228 | 232 | 236 |
240 | 244 | 248 | 252 | 256 |
하지만 p는 포인터 변수이므로 p + 1 == p의 값 + 4가 된다.
왜 ? p 는 포인터 변수이므로 4byte를 차지하기 때문이다.
그러므로 똑같은 메모리 크기를 위해서는 생소하지만 int(*p)[5] = a; 와 같은 선언을 해주어야 한다.
만약 여기서 괄호를 지워주면
int* p[5];
와 같은 선언이 되며, int 주소를 저장하는 배열이 된다.
p[0]의 값은 20과 같은 정수가 아닌
p[0] = &k (k는 int 변수)
가 된다.
이는 포인터 배열로, 앞서 포스팅한 내용으로 넘어가게 된다.