[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;