G Y U L O G

title

헷갈리는 부분 정리하는 겁니다. 틀린부분 있으면 댓글로 달아주세요.

▶배열 포인터와 포인터 배열

 

배열 포인터는 배열상태의 포인터변수를 말합니다. 포인터 배열은 포인터를 배열원소로 한 배열이구요.

 

단어 위치만 바꿨는 데 이해하기 난해해 집니다.

 

포인터 배열 먼저 보겠습니다.

 

int a = 1, b = 2, c = 3;

int *pa[] = {&a, &b, &c};

포인터 변수에서 변수라는 형식이 배열로 바뀐 겁니다.

 

배열의 각 원소에는 주소값이 저장되고 참조하고 있는 값에 접근하려면 *pa[1]과 같은 표현을 쓰게되죠.

 

*pa[1]의 경우에는 변수 a를 참조하는 표현입니다.

 

여기서 배열포인터를 보게되면 머리가 띵 해집니다.

 

int *(pa)[3];

변수에 괄호만 쳤는데 갑자기 오류가 생기죠. 이렇게 생긴 녀석을 배열 포인터라고 하는데 이차원 배열의 주소를 받을 수 있습니다.

 

이차원 배열의 선언규칙에서 중요한 건 열의 크기를 생략할 수 없다는 것입니다. 이 규칙은 배열포인터에서도 이어집니다.

 

그러므로  *(pa)[3]에서 3은 열 크기가 3인 이차원 배열을 받을 수 있다는 걸 의미하는 것이죠.

 

int *(pa)[3];
int *pa[3];

이 두 선언의 의미를 이제 구분할 수 있습니다.

 

첫번째 - 열 크기가 3인 이차원 배열의 주소값을 갖는 배열포인터.

두번째 - 배열의 크기가 3인 포인터배열.(포인터변수 3개)

 

배열포인터는 일차원배열과 같이 놓고 봐야 이해가 빨라집니다.

char one_dimension[] = {'@','#','$','^','&','*'};
char two_dimension[][2]={'@','#','$','^','&','*'};
    
char *ptr_od = one_dimension;
char (*ptr_td)[2] = two_dimension;

*ptr_od는 일차원배열의 주소값을 받습니다. 배열의 이름이 곧 첫번째 원소의 주소값이기 때문에 저렇게 쓰는 거죠.

 

이차원 배열의 경우 위에서 설명한 것 처럼 값을 받습니다.

 

배열 포인터의 경우 사용에 주의를 기울여야 하죠.

 

차원을 나눠서 배열을 만든다고는 하지만 단순히 단위별로 구분지은 것일 뿐 연속된 주소값을 가지고 있다는 것은 변하지 않습니다.

 

char two_dimension[][2]={'@','#','$','^','&','*'};
char (*ptr_td)[2] = two_dimension;
    
printf("%c\n", *(*(ptr_td+2)+1));
printf("%c\n", *(*ptr_td+5));

이 코드의 경우 동일한 결과 값을 출력합니다.

출력값

모두 마지막 행의 마지막 열 값을 출력하죠.

 

첫번째 출력문은 차원을 구분한 것이고, 두번째 출력문은 단순히 주소위치로 출력한 겁니다. 연속된 주소값을 갖고 있기 때문에 위와 같은 표현을 사용할 수 있습니다.

 

댓글과 공감은 정말 큰 힘이 됩니다.

공유하기

facebook twitter kakaoTalk kakaostory naver band