int arr[3][3] 이란 2차원배열이 있다고 하자.
printf("%p",arr);
printf("%p",arr[0]);
은 동일한 결과값을 출력한다.
그러나 arr 과 arr[0] 은 서로 다른 것이다.
arr 의 사이즈를 출력하면 배열 전체의 사이즈가 나오고
arr[0] 의 경우 한 행의 사이즈가 나온다.
2차원 배열의 증감연산
int arr1[3][2];
int arr2[2][3];
arr1, arrr1+1, arr1+2 는 8씩 증가한다 (4바이트 x 2열)
arr2, arr2+1 은 12씩 증가한다 (4바이트 x 3열)
즉 이중배열의 증감연산의 공식은 ( 자료형의크기 x 열의 수 ) 이다.
그리고 연산결과는 각 행의 첫번째 요소의 주소값이다.
예를 들면 arr1+1 은 arr1[1][0] 의 주소값을 나타낸다.
2차원 배열과 포인터 변수의 관계
int형 변수이면서 (4 x 4) 의 단위로 증감연산되는(4칸씩 건너뛰는) 2차원 배열은 아래와 같다.
int arr[][4];
포인터 변수로 표현하면 아래와 같다.
int (*arr) [4];
그 외
char (*arr1)[4]; // char형 변수를 가리키면서 포인터연산시 ( 1 x 4 ) 단위로 증감연산
double (*arr2)[7]; // double형 변수를 가리키면서 포인터연산시 ( 8 x 7 ) 단위로 증감연산
'배열 포인터'와 '포인터 배열'의 구분
포인터 배열은 말 그대로 포인터 변수들로 이루어진 배열이다.
int* arr1[4];
배열 포인터는 배열을 가리키는 용도의 포인터 변수를 의미한다.
int (*arr2)[4];
2차원배열 을 함수의 인자로 받는 방법
이렇게 Func의 인자로 arr을 받기 위해서는
int arr[2][7];
Func(arr);
인자를 이런 식으로 선언해야 한다.
void Func( int (*parr)[7] );
void Func( int parr[][7] );