[C언어] 3. 다차원 배열과 포인터의 관계




제가 책(윤성우의 열혈 C 프로그래밍)을 보다가 까먹었던 부분만 포스팅 하는 것입니다!

순서가 뒤죽박죽이어도 이해해주세요~~!

포인터배열의 이름



int arr[10]; //1차원 배열이름 arr는 int형 포인터!

int *parr[20]; //포인터 배열이름 parr는 int형 더블 포인터



왜냐하면 parr가 parr[0] (int형 포인터)의 주소를 저장해야하기 때문입니다.



2차원 배열의 이름



다음과 같이 선언된 2차원 배열이 있다고 가정해보겠습니다.

int arr[3][3];



이 때,

arr가 가리키는 주소는 arr[0][0]의 주소

arr[0]이 가리키는 주소는 arr[0][0]의 주소

arr[1]이 가리키는 주소는 arr[1][0]의 주소

arr[2]가 가리키는 주소는 arr[2][0]의 주소



arr와 arr[0]의 차이점



arr와 arr[0] 둘다 이차원 배열의 첫번째 원소 arr[0][0]을 가리킵니다.

하지만,

arr를 sizeof연산을 하는경우 배열 전체의 크기를 반환,

arr[0]을 sizeof 연산을 하는 경우 1행의 크기를 반환한다는 점에서 차이점이 있습니다.

즉, arr는 첫번째요소를 가리키면서 배열 전체를 의미, arr[0]은 첫번째요소를 가리키면서 1행만을 의미합니다.



배열이름 포인터 연산



2차원 배열이름 arr를 대상으로 증가 및 감소연산을 할 경우에는 각 행의 첫 번째 요소의 주소 값이 됩니다.

예를 들어 이차원 배열 arr[3][3]에서

arr //arr[0][0]을 가리킵니다.

arr+1 //arr[1][0]을 가리키게 됩니다.

arr+2 //arr[2][0]을 가리키게 됩니다.



2차원 배열이름의 포인터 형



만약 2차원 배열이 int arr[3][4]이라고 하면,

그 배열을 가리키는 배열 포인터는 다음과 같습니다.

int (*ptr)[4] //포인터 연산 시 4칸씩 건너뛰는 포인터!!



괄호가 정말 중요합니다~~

왜냐하면 배열 포인터와 포인터 배열을 혼동할 수 있기 때문입니다.

int *ptr[4]; //포인터 배열
int (*ptr)[4]; //배열 포인터



2차원 배열을 함수의 인자로 전달하기



2차원 배열을 함수의 인자로 전달할 때는 2가지 방법이 있습니다.

만약 2차원 배열이 int arr[3][7]이라고 하면,

void function(int (*ptr)[7],int column);

void function(int ptr[][7],int column);



주의해야할 것은 매개변수 선언에서만 같습니다.

그 이외의 영역에서 선언 시 int (*ptr)[7]은 다른 배열을 가리킬 수 있지만,

int ptr[][7]의 배열이름인 ptr은 다른 배열을 가리킬 수 없습니다~

그리고 1차원 배열과 마찬가지로 함수에 인자를 전달할 때 column도 같이 전달합니다.

int column=sizeof(arr)/sizeof(arr[0]);



2차원 배열에서도 arr[i]와 *(arr+i)는 같다



다음은 모두 같은 표현이다.

arr[2][1]=4;

*(arr+2)[1]=4;

*(arr[2]+1)=4;

*(*(arr+2)+1)=4;