본문 바로가기
프로그래밍 언어/C 언어

[C] 다차원 배열과 포인터 관계

by 까망 하르방 2021. 3. 20.
반응형

다차원 배열과 포인터 관계 

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]);

매개변수의 선언에서만 같은 의미를 지니며, 다른 영역에서는 다른 의미를 가집니다.

※ [C] 포인터와 배열의 관계

 

[C] 포인터와 배열의 관계

포인터와 배열의 관계 배열의 이름도 포인터 (배열의 첫번째 요소부터 가르키고 있음) (단, 그 값을 바꿀 수 없는 상수 형태의 포인터라고 합니다.) #include int main(void) { int arr[3] = { 0, 1, 2 }; printf(..

zoosso.tistory.com

 

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
}

 

반응형

댓글