헷갈리는 부분 정리하는 겁니다. 틀린부분 있으면 댓글로 달아주세요.
배열 포인터는 배열상태의 포인터변수를 말합니다. 포인터 배열은 포인터를 배열원소로 한 배열이구요.
단어 위치만 바꿨는 데 이해하기 난해해 집니다.
포인터 배열 먼저 보겠습니다.
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));
이 코드의 경우 동일한 결과 값을 출력합니다.
모두 마지막 행의 마지막 열 값을 출력하죠.
첫번째 출력문은 차원을 구분한 것이고, 두번째 출력문은 단순히 주소위치로 출력한 겁니다. 연속된 주소값을 갖고 있기 때문에 위와 같은 표현을 사용할 수 있습니다.
댓글과 공감은 정말 큰 힘이 됩니다.