[열혈C프로그래밍] chapter 16. 다차원 배열과 포인터의 관계

chapter 16

다차원 배열과 포인터의 관계

1차원 배열의 포인터 형

int arr[10]; // arr은 int형 포인터
//배열의 이름 arr는 arr[0]을 가리키는데 arr[0]은 int이므로
//arr의 포인터 형은 int* 임을 알 수 있다.

=> 1차원 배열의 포인터형은 가리키는 변수의 type형 포인터임을 알수 있다.

2차원 배열의 포인터 형

int arr[2][10]; // arr은 10의 길이를 가진 int형 포인터
//arr의 포인터형은 (int*)[10]임을 알 수 있다.

arr[3][2] = { { 1 , 2 } , { 3 , 4 } , { 5 , 6 } }이라면
arr[0] = { 1 , 2 },
arr[1] = { 3 , 4 },
arr[2] = { 5 , 6 }임을 명심하자

printf(“arr1: %p \n”, arr1); printf(“arr1: %p \n”, arr1+1); // 열의길이가 2이므로 sizeof(int)x2, 주소값이 8증가.

printf(“arr2: %p \n”, arr2); printf(“arr2: %p \n”, arr2+1); // 열의 길이가 3이므로 sizeof(int)x3, 주소값이 12증가.

// 결론 arr의 주소 증가는 행 단위로 증가하기 때문에 sizeof(int) x 열의 길이 만큼 주소값이 증가한다.


### 포인터 배열과 배열 포인터 구분하기

```c
배열 포인터: int (*ptr) [4];  // 4는 한 행의 가로길이, 즉 열의 길이를 나타낸다. type은 int* [4] 
포인터 배열: int *ptr[4]; // 포인터들을 element로 저장하는 포인터 배열. ptr의 type은 더블 포인터. 

쓰임새

배열 포인터: 배열의 주소값을 저장하기 위한 용도 쓰임.

int arr[3][2];
int (*ptr)[2] = arr;

포인터 배열: 포인터들을 담기위한 배열로서 사용한다.

int *ptr1;
int *ptr2;
int *ptr3;
int *ptr[3] = { ptr1 , ptr2 , ptr3 }; // 포인터들을 담기위한 용도. 변수라면 &연산자를 붙이자 (&num)