37.3 2차원 배열을 포인터에 넣기
2차원 배열과 포인터
2차원 배열을 포인터에 담으려면 특별한 방법이 필요하다.
자료형 (*포인터이름)[가로크기];
- 포인터를 선언할 때
*
과 포인터 이름을 괄호로 묶어준다. [ ]
에 가로 크기를 지정한다.
int (*numPtr)[4];
// 가로 크기가 4인 배열을 가리키는 포인터 numPtr
참고) int *numPtr[4]
int (numPtr)[4]에서 괄호를 뺀 int numPtr[4]은 int형 포인터 4개를 담을 수 있는 배열이라는 뜻이다. 즉, 괄호가 있으면 배열을 가리키는 배열 포인터, 괄호가 없으면 포인터를 여러가 담는 포인터 배열__이다.
int num1, num2, num3, num4; int *numPtr[4] = { &num1, &num2, &num3, &num4 }; // int형 포인터를 4개 담는 배열
2차원 배열 포인터에 할당하기
#include <stdio.h>
int main()
{
int numArr[3][4] = { // 세로 3, 가로 4 크기의 int형 2차원 배열 선언
{ 11, 22, 33, 44 },
{ 55, 66, 77, 88 },
{ 99, 110, 121, 132 }
};
int (*numPtr)[4] = numArr;
printf("%p\n", *numPtr); // 002BFE5C: 2차원 배열 포인터를 역참조하면 세로 첫 번째의 주소가 나옴
// 컴퓨터마다, 실행할 때마다 달라짐
printf("%p\n", *numArr); // 002BFE5C: 2차원 배열을 역참조하면 세로 첫 번째의 주소가 나옴
// 컴퓨터마다, 실행할 때마다 달라짐
printf("%d\n", numPtr[2][1]); // 110: 2차원 배열 포인터는 인덱스로 접근할 수 있음
printf("%d\n", sizeof(numArr)); // 48: sizeof로 2차원 배열의 크기를 구하면 배열이 메모리에
// 차지하는 공간이 출력됨
printf("%d\n", sizeof(numPtr)); // 4 : sizeof로 2차원 배열 포인터의 크기를
// 구하면 포인터의 크기가 출력됨(64비트라면 8)
return 0;
}
-
int (*numPtr)[4] = numArr; 와 같이 2차원 배열을 포인터에 바로 할당할 수 있다.
-
단, 자료형과 가로 크기가 일치해야 한다.
-
⭐ 2차원 배열을 포인터에 할당한 뒤 포인터를 역참조해보면 _-배열의 세로 첫번째 주솟값__이 나온다. 즉,
배열이 시작하는 주소
이다. -
⭐ 2차원 배열 자체도 역참조해보면 배열의 세로 첫 번째 주솟값이 나온다.
- 2차원 배열 포인터는
[ ]
를 두 번 사용하여 배열의 요소에 접근할 수 있다.
배열과 포인터의 다른점
배열과 포인터가 다른 점은 sizeof
로 크기를 계산했을 때이다.
- sizeof로 배열의 크기를 구해보면 배열이 메모리에 차지하는 공간이 출력된다.
- sizeof로 배열의 주소가 들어있는 포인터의 크기를 구해보면 그냥 포인터의 크기만 나온다. (32비트에서는 4, 64비트에서는 8)
참고) 3차원 배열
3차원 배열은 높이⨉가로⨉세로 형태로 이루어져 있다.
3차원 배열은[ ]
에 높이, 세로 크기, 가로 크기를 지정하여 선언합니다. 값을 초기화할 때는 면 단위로 중괄호를 묶어주면 편리합니다.
- 자료형 배열이름[높이][세로크기][가로크기];
3차원 배열에 접근하려면[ ]
를 세 번 사용하여 높이, 세로, 가로 인덱스를 지정해주면 된다.- 배열[높이인덱스][세로인덱스][가로인덱스];
- 배열[높이인덱스][세로인덱스][가로인덱스] = 값;
3차원 배열의 높이(깊이), 세로, 가로를 구하는 방법은 다음과 같습니다(보통 높이는 깊이를 뜻하는 depth로 표현).int depth = sizeof(numArr) / sizeof(numArr[0]); // 2: 3차원 배열이 차지하는 전체 공간을 // 면의 크기로 나눠줌 int row = sizeof(numArr[0]) / sizeof(numArr[0][0]); // 3: 한 면의 크기를 가로 한 줄의 크기로 나눠줌 int column = sizeof(numArr[0][0]) / sizeof(int); // 4: 가로 한 줄의 크기를 요소의 크기로 나눠줌
3차원 배열을 포인터에 할당하려면 세로x가로로 구성된 면을 가리키는 포인터를 선언하면 됩니다.
- 자료형 (*포인터이름)[세로크기][가로크기]
int (*numPtr)[3][4] = numArr; // 세로 크기 3, 가로 크기 4인 면을 가리키는 포인터 선언
출처
https://dojang.io/mod/page/view.php?id=312
Author And Source
이 문제에 관하여(37.3 2차원 배열을 포인터에 넣기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@shuajjjjj/37.3-2차원-배열을-포인터에-넣기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)