다차원 배열과 포인터 관계
1, 2차원 배열 모두 크기를 알려주지 않고 초기화가 가능
int arr[] = {1, 2, 3}; // 크기: 3
int arr[][4] = {1, 2, 3, 4, 5, 6, 7, 8}; // 크기: 3 × 4
int arr[][2] = {1, 2, 3, 4, 5, 6, 7, 8}; // 크기: 6 × 2
int arr[][] = {} // 정확히 어떤 크기를 가져야 할지 알 수 없기에 컴파일 에러
int arr[2][] = {1, 2, 3, 4}; // {1, 2, 3} + {4} 크기를 어떻게 잡을지 알 수 없으므로 컴파일 에러
배열이름 기반의 포인터 연산: 배열 이름에 1을 더한 결과는?
#include <stdio.h>
int main(void){
int arr1[3][2], arr2[2][3];
printf("%p \n", arr1);
printf("%p \n", arr1 + 1);
printf("%p \n", arr1 + 2);
printf("%p \n", arr2);
printf("%p \n", arr2+1);
}
arr + i는 각 행의 첫번째 시작 주소를 가리키게 됩니다.
이는 배열의 행(가로)의 크기(=열의 개수)에 따라서 연산되는 수치가 다른 것을 알 수 있습니다.
배열 arr[][]에서 이름 arr과 arr[0]의 차이는 무엇일까?
포인터 관점에서 arr과 arr[0]이 가르키고 있는 주소는 동일합니다. (배열의 시작 주소를 가르키고 있음)
하지만 sizeof 연산의 경우 arr은 배열의 전체 크기를 반환하고, arr[0]은 첫번째 행의 크기를 반환.
2차원 배열이름의 포인터형 선언
- 배열이름(포인터)를 대상으로 값을 증감할 때, 실제로 얼마정도로 감소해야 될지 알 수 있어야 합니다.
#include <stdio.h>
int main(void) {
int arr1[2][2] = { {1, 2}, {3, 4} };
int arr2[3][2] = { {1, 2}, {3, 4}, {5, 6} };
int(*ptr)[2];
ptr = arr1;
for (int i = 0; i < 2; i++) {
printf("%d %d \n", ptr[i][0], ptr[i][1]);
}
ptr = arr2;
for (int i = 0; i < 3; i++) {
printf("%d %d \n", ptr[i][0], ptr[i][1]);
}
}
참고 사항
int *ptr [4]; // 포인터 배열 (배열 선언)
int (*ptr)[4]; // 배열 포인터 (포인터 변수 선언)
예시 코드
#include <stdio.h>
int main(void) {
int a = 1, b = 2, c = 3, d = 4;
int* ptr1[4] = { &a, &b, &c, &d }; // 포인터 배열 (배열 선언)
for (int i = 0; i < 4; i++) {
printf("%d ", *ptr1[i]);
}
printf("\n");
int arr[2][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}};
int(*ptr2)[4] = arr; // 배열 포인터 (포인터 변수 선언)
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 4; j++) {
printf("%d ", ptr2[i][j]);
}
}
}
매개변수에서의 이차원 배열 선언
void sampleFunc(int (*ptr)[7]);
void sampleFunc(int arr[][7]);
매개변수의 선언에서만 같은 의미를 지니며, 다른 영역에서는 다른 의미를 가집니다.
2차원 배열에서도 1차원 배열과 마찬가지로 arr[i] == *(arr + i)
arr[2][1] = 4
(*(arr+2))[1] = *(arr[2]+1) = *(*(arr+2)+1) = 4
[예시 코드]
#include <stdio.h>
int main(void){
int a[5] = {1, 2, 3, 4, 5};
int *p = a;
printf("%d\n", *(p++)); // 1
printf("%d\n", *(++p)); // 3
printf("%d\n", *(p+2)); // 5
}
'프로그래밍 언어 > C 언어' 카테고리의 다른 글
[C] 포인터의 포인터(이중 포인터) (0) | 2021.03.20 |
---|---|
[C] 포인터 변수 개념 (0) | 2021.03.20 |
[C] Call-by-value & Call-by-reference (0) | 2021.03.20 |
[C] 포인터와 배열의 관계 (0) | 2021.03.20 |
[C] 동적 할당 필요성 (0) | 2021.03.20 |
댓글