[열혈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 }임을 명심하자
- 2차원 배열의 포인터 형은 type이 같더라도 열의 길이이 다르면 포인터형이 다르다. ```c int arr1[3][2]; // arr1은 가리키는 대상이 int형 변수이면서 포인터 연산시 sizeof(int)x2 의 크기단위로 //증가 및 감소하는 포인터형. int arr2[2][3]; // arr2은 가리키는 대상이 int형 변수이면서 포인터 연산시 sizeof(int)x3 의 크기단위로 //증가 및 감소하는 포인터형.
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)