18장. 다차원 배열 그리고 포인터
18-1 2차원 배열 이름의 포인터 타입 그림 18-1 그림 18-2
18-1 2차원 배열 이름의 포인터 타입 1차원 배열 이름의 포인터 타입 결정 포인트! 1차원 배열 이름 18-1 2차원 배열 이름의 포인터 타입 1차원 배열 이름의 포인터 타입 결정 포인트! 포인터가 가리키는 요소의 자료형 포인터 연산 시 증가하는 바이트의 크기 1차원 배열 이름 배열 이름이 가리키는 요소의 자료형이 일치 한다면, 포인터 연산 시 증가하는 값의 크기도 일치. 따라서 1차원 배열 이름의 경우 가리키는 요소만 참조.
18-1 2차원 배열 이름의 포인터 타입 다차원 배열의 포인터 타입 결정 포인트! 2차원 배열 이름 18-1 2차원 배열 이름의 포인터 타입 다차원 배열의 포인터 타입 결정 포인트! 포인터가 가리키는 요소의 자료형 포인터 연산 시 증가하는 바이트의 크기 2차원 배열 이름 포인터가 가리키는 요소의 자료형이 같다 해도 포인터 연산 시 증가하는 값의 크기 불일치! 포인터 연산 결과도 생각해 봐야 함.
18-1 2차원 배열 이름의 포인터 타입 2차원 배열 이름의 특성 이해(1단계) 그림 18-4 그림 18-5 18-1 2차원 배열 이름의 포인터 타입 2차원 배열 이름의 특성 이해(1단계) /* two_array1.c */ #include <stdio.h> int main(void) { int a[3][2]={1, 2, 3, 4, 5, 6}; printf("a[0] : %d \n", a[0]); printf("a[1] : %d \n", a[1]); printf("a[2] : %d \n", a[2]); printf("a : %d \n", a); return 0; } 그림 18-4 그림 18-5
18-1 2차원 배열 이름의 포인터 타입 2차원 배열 이름의 특성 이해(2단계) 그림 18-6 그림 18-7 18-1 2차원 배열 이름의 포인터 타입 2차원 배열 이름의 특성 이해(2단계) /* arr2_name.c */ #include <stdio.h> int main(void) { int a[3][2]={1, 2, 3, 4, 5, 6}; printf("a : %d \n", a ); printf("a+1 : %d \n", a+1); printf("a+2 : %d \n", a+2); return 0; } 그림 18-6 그림 18-7
18-1 2차원 배열 이름의 포인터 타입 2차원 배열 이름의 특성 이해(결론1) 그림 18-8
18-1 2차원 배열 이름의 포인터 타입 2차원 배열 이름의 특성 이해(결론2) 2차원 배열 이상의 포인터 타입 구성 18-1 2차원 배열 이름의 포인터 타입 2차원 배열 이름의 특성 이해(결론2) 2차원 배열 이상의 포인터 타입 구성 가리키는 대상의 자료형 포인터 연산 시 증가하는 바이트의 크기 /* arr2_ptr.c */ #include <stdio.h> int main(void) { int arr1[3][2]; printf("arr1 : %d \n", arr1); printf("arr1+1 : %d \n", arr1+1); printf("arr1+2 : %d \n", arr1+2); return 0; } /* arr2_ptr.c */ #include <stdio.h> int main(void) { int arr2[2][3]; printf("arr2 : %d \n", arr2); printf("arr2+1 : %d \n", arr2+1); printf("arr2+2 : %d \n", arr2+2); return 0; }
18-1 2차원 배열 이름의 포인터 타입 2차원 배열 이름에 일치하는 포인터 선언 예제 pnt_arr.c 참조 그림 18-12 18-1 2차원 배열 이름의 포인터 타입 2차원 배열 이름에 일치하는 포인터 선언 예제 pnt_arr.c 참조 int arr[2][4]; int (*pArr)[4]; 그림 18-12
18-1 2차원 배열 이름의 포인터 타입 매개 변수로 선언되는 포인터의 또 다른 표현 그림 18-13 18-1 2차원 배열 이름의 포인터 타입 매개 변수로 선언되는 포인터의 또 다른 표현 그림 18-13 int main (void) { int arr1[2][4]={1, 2, 3, 4, 5, 6, 7, 8}; int (*ptr1)[4]=arr1; // OK int ptr2[][4]=arr1; // ERROR . . . . .
“int (*pArr)[4]” 과 “int* pArr[4]”의 차이점 18-1 2차원 배열 이름의 포인터 타입 “int (*pArr)[4]” 과 “int* pArr[4]”의 차이점 그림 18-14
18-2 2차원 배열에서의 “arr[i]”와 “*(arr+i)” 다양한 형태의 배열 요소 접근 방법 /* two_array2.c */ #include <stdio.h> int main(void) { int a[3][2]={ {1, 2}, {3, 4}, {5, 6} }; printf("a[0] : %d \n", a[0]); printf("*(a+0) : %d \n", *(a+0)); printf("a[1] : %d \n", a[1]); printf("*(a+1) : %d \n", *(a+1)); printf("a[2] : %d \n", a[2]); printf("*(a+2) : %d \n", *(a+2)); printf("%d, %d \n", a[1][0], (*(a+1))[0]); printf("%d, %d \n", a[1][2], *(a[1]+2)); printf("%d, %d \n", a[2][1], *(*(a+2)+1)); return 0; }