나의 지식 보관소
다차원 배열과 포인터의 관계 본문
2차원 배열의 이름이 가리키는 것은
2차원 배열 int arr2d[3][3]; 가 있다고 가정해보자. 배열의 이름인 arr2d가 가리키는 것은 첫 번째 요소의 주소이다.
또한 arr2d[0], arr2d[1], arr2d[2]은 각각 1행 2행 3행의 첫 번째 요소를 가리킨다.
그렇다면 arr2d와 arr2d[0]은 같은 것일까? 지닌 주소 값 자체는 같다. 하지만 arr2d와 arr2d[0]에 각각 sizeof연산을 해보면 arr2d는 36을 반환하는 것에 반해 arr2d[0]는 12를 반환한다. 즉 배열 이름인 arr2d는 배열 전체의 크기를 반환하였고 arr2d[0]은 1행의 크기를 반환한 것이다. 따라서 2차원 배열의 이름인 arr2d는 첫 번째 요소를 가리키면서 배열 전체를 의미하지만, arr2d[0]는 첫 번째 요소를 가리키되 1행만을 의미한다.
배열의 이름에 1을 더한 결과는
1차원 배열 int arr[3];에서 arr+n의 연산 결과는 arr+n*sizeof(int)였다. 그리고 식에서 보이다시피 포인터형이 같다면 포인터를 대상으로 하는 증감 연산의 결과로 증가, 감소하는 값의 크기는 동일하다.
그럼 2차원 배열에서 더하기 연산은 어떻게 처리될까?
int arr1[2][3];
int arr2[2][4];
printf("%d -> %d\n",arr1, arr1+1);//12증가
printf("%d -> %d\n",arr2, arr2+1);//16증가
위 코드에서 볼 수 있듯 2차원 배열의 이름인 arr1을 대상으로 증감 연산을 하면, arr1은 첫 번째 행을, arr1+1은 두 번째행을 가리킨다. 즉 arr[1]과 *(arr+1)은 같다
그리고 앞서 말했듯 포인터형이 같다면 포인터를 대상으로 하는 증감 연산의 결과로 증가, 감소하는 값의 크기가 같아야 하므로 arr1과 arr2의 포인터형은 다르다.
배열 포인터
앞서 말한 내용을 종합해볼 때, 2차원 배열을 저장하는 포인터는 어떻게 선언할까? 아래의 코드를 보아라.
int (*ptr) [4];
위 코드에서 (*ptr)은 ptr이 포인터임을, int는 ptr이 int형을 가리키는 포인터임을, [4]는 포인터에 증감 연산을 할 때 4칸씩 건너뛰는 포인터임을 뜻한다.
주의할 점은 포인터 배열과 배열 포인터의 생김새가 매우 흡사하다는 것이다. 아래의 코드는 포인터 배열이다.
int* ptr[4];
둘의 차이점을 기억해서 혼동하지 않도록 해야 한다.
'프로그래밍 언어 > C' 카테고리의 다른 글
void 포인터 (0) | 2020.01.09 |
---|---|
함수포인터 (0) | 2020.01.09 |
포인터를 대상으로 하는 const선언 (0) | 2020.01.05 |
상수 형태의 문자열 (0) | 2020.01.05 |
포인터 연산 (0) | 2020.01.05 |