1. 다차원 배열의 포인터형이란?
2차원 배열 이름의 포인터 형을 결정짓는 정보는 2가지이다.
- 배열 요소를 구성하는 변수의 자료형
- 배열의 가로길이
예를 들어 2차원 배열 double arr[4][5]의 배열 이름 arr과 동일한 포인터 형의 변수는 다음과 같이 선언된다.
2. 2차원 배열의 포인터형의 배경
앞서 1차원 배열의 포인터형과는 2차원 배열의 포인터형은 다른데 그 이유를 보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include <stdio.h> int main(void) { int arr1[3][2]; int arr2[3][3]; int arr3[3][4]; printf("%d %d \n", arr1, arr1+1); printf("%d %d \n", arr2, arr2+1); printf("%d %d \n", arr3, arr3+1); return 0; } | cs |
1 2 3 | 6487600 6487608 6487552 6487564 6487504 6487520 | cs |
5~7행에 2차원 배열을 선언하고 있다. 그런데 가로의 길이가 각각 다르다.
그리고 9~10행에 배열 주소값에 +1을 증가시켜 값을 출력했다.
여기서 포인터형이 동일하면 덧셈 연산시 증가하는 값이 크기가 4로 동일해야하는데, 각각 8,12,16
이 증가했다. arr1,arr2,arr3의 포인터형이 서로 다르다는 것이다.
즉 2차원 배열의 이름의 포인터 형은 1차원과는 다르게 배열 요소의 자료형이 동일해도 가로 길이
에 따라서 달라질 수 있다. 위에서 2차원 배열의 이름에 1을 더할때 반환되는 주소 값의 크기는 행
의 바이트 크기만큼 증가한다.
즉 다시 말하면 2차원 배열 이름의 포인터 형을 결정짓는 정보는 2가지이다
- 배열 요소를 구성하는 변수의 자료형
- 배열의 가로길이
3. 2차원 배열의 포인터형 예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | #include <stdio.h> void InitArrWD3(int (*ar)[3], int height, int initNum) { int i, j; for(i=0; i<height; i++) for(j=0; j<3; j++) ar[i][j]=initNum; } void InitArrWD4(int (*ar)[4], int height, int initNum) { int i, j; for(i=0; i<height; i++) for(j=0; j<4; j++) ar[i][j]=initNum; } int main(void) { int i, j; int arr1[3][3]; int arr2[4][4]; int (* pArr1)[3]=arr1; int (* pArr2)[4]=arr2; InitArrWD3(arr1, 3, 5); InitArrWD4(arr2, 4, 7); for(i=0; i<3; i++) { for(j=0; j<3; j++) printf("%4d", pArr1[i][j]); printf("\n"); } printf("\n"); for(i=0; i<4; i++) { for(j=0; j<4; j++) printf("%4d", pArr2[i][j]); printf("\n"); } return 0; } | cs |
1 2 3 4 5 6 7 8 | 5 5 5 5 5 5 5 5 5 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | cs |
22~23행: 두개의 배열이 선언되었다. 배열 요소의 자료형은 같으나, 가로 길이가 달라 포인터형이 다르다.
25~26행: 다차원 배열 포인터 형의 변수를 각각 선언하고 있다. 각각은 포인터형이 다르다.
34,44행 : 2차원 배열을 가리키는 포인터 변수의 이름을 이용해서 배열 방식으로 접그하는 것을 보여준다.
3행,11행: 함수의 첫번째 매개변수를 각각 int ar[ ][3], int ar[ ][4]와 같이 선언해도 된다.
'BackEnd > C' 카테고리의 다른 글
자료형에 이름을 부여하는 typedef 키워드 (0) | 2019.03.14 |
---|---|
Call-By-Value vs Call-By-Reference (0) | 2019.03.14 |
배열의 이름은 상수 형태의 포인터이다. (0) | 2019.03.13 |
제한된 형태의 포인터 연산 (0) | 2019.03.13 |
포인터 배열 (0) | 2019.03.13 |