Study/Object-Oriented

배열포인터

__PS 2022. 6. 13. 22:26
728x90

포인터 배열은 말 그대로 포인터로 이루어진 배열이다.

앞서 포스팅한 배열 포인터와는 이름부터가 다르다.

 

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 변수)

가 된다.

이는 포인터 배열로, 앞서 포스팅한 내용으로 넘어가게 된다.