C, C++

C언어 코딩도장(2차원 배열을 포인터에 넣기)

2DC 2022. 4. 30. 17:53

1차원 배열은 단일 포인터에 넣을 수 있었다.

그렇다면 2차원 배열은 이중 포인터에 넣을 수 있을까?

 

아무 값도 나오지 않는다.

 

컴파일을 하면 오류는 안나지만 아무 값도 안나온다.

2차원 배열을 포인터에 담으려면 다음과 같은 특별한 방법이 필요하다.

 

  • 자료형(*포인터이름)[가로크기];

즉, 포인터를 선언할 때 *와 포인터 이름을 괄호로 묵어준 뒤 []에 가로 크기를 지정한다.

int (*numPtr)[4];​

풀어서 설명하면 가로 크기가 4인 배열을 가리키는 포인터라는 뜻이다.


int *numPtr[4]는 int형 포인터 4개를 담을 수 있는 배열이라는 뜻이다.

즉, 괄호가 있으면 배열을 가리키는 배열 포인터, 괄호가 없으면 포인터를 여러개 담는 포인터 배열이다.

int num1, num2, num3, num4;
int *numPtr[4] = {&num1, &num2, &num3, &num4};  // int형 포인터를 4개 담는 배열

이제 2차원 배열을 포인터에 할당해서 사용해보자!

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    int numArr[3][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };

    int(*numPtr)[4] = numArr;
    printf("%p\n", numPtr);  // 2차원 배열 포인터를 역참조하면 세로 첫 번째 주소가 나옴.
    printf("%p\n", *numArr); // 2차원 배열을 역참조하면 세로 첫 번째 주소가 나옴.
    printf("%p\n", &numArr); // 2차원 배열 주소를 참조하면 세로 첫 번째 주소가 나옴.

    printf("%d\n", numPtr[2][1]);
    printf("%d\n", sizeof(numArr));  
    printf("%d\n", sizeof(numPtr));

    return 0;
}

int(*numPtr)[4] = numArr;과 같이 2차원 배열을 포인터에 바로 할당할 수 있다.

단, 자료형과 가로 크기가 일치해야 한다.