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차원 배열을 포인터에 바로 할당할 수 있다.
단, 자료형과 가로 크기가 일치해야 한다.
'C, C++' 카테고리의 다른 글
C++) Hello world (0) | 2024.01.17 |
---|---|
C) 싱글 링크드 리스트 구현 + 메모리 추적 (1) | 2024.01.14 |
C언어 코딩도장(2차원 배열 사용하기) (0) | 2022.04.30 |
C언어 코딩도장(배열: 가장 작은 수 출력하기) (0) | 2022.04.29 |
C언어 코딩도장(배열 사용하기) / 2진수 계산기 (0) | 2022.04.29 |