SH1R0_HACKER

C언어 :: 포인터 정리 (4) - 2차원 배열과 배열 포인터 본문

Programming Language/C

C언어 :: 포인터 정리 (4) - 2차원 배열과 배열 포인터

SH1R0_HACKER 2021. 1. 17. 11:46
// 포인터 정리(4)
// 2차원 배열과 배열 포인터

#include <stdio.h>

void example1() {
	int arr[2][3] = {
		{1, 2, 3},
		{4, 5, 6}
	};

	printf("sizeof(arr) = %d\n", sizeof(arr)); // 24
	printf("sizeof(arr[0]) = %d\n", sizeof(arr[0])); // 12
	printf("sizeof(arr[0][0] = %d\n\n", sizeof(arr[0][0])); // 4 

	// &arr = &arr[0] = &arr[0][0]
	printf("&arr = %d\n", &arr);
	printf("&arr[0] = %d\n", &arr[0]);
	printf("&arr[0][0] = %d\n", &arr[0][0]);
}

void example2() {
	int arr[2][3] = {
		{1, 2, 3},
		{4, 5, 6}
	};
	int(*ptr)[3] = arr;	// arr = &arr[0]


	for (int i = 0; i < 2; i++) {
		for (int j = 0; j < 3; j++) {
			printf("%d ", ptr[i][j]);
		}
		printf("\n");
	}

	printf("sizeof(*ptr) = %d\n", sizeof(*ptr)); // 12
	printf("sizeof(arr[0]) = %d\n\n", sizeof(arr[0])); // 12

	// 1. ptr[i] == arr[i]
	// 2. ptr[i][j] == arr[i][j]
	// ptr == arr

	// ptr = arr은 ptr = &arr[0]와 동일함. 즉, ptr은 arr = arr[0]를 가리킴
	// ptr[1] = *(ptr + 1)  = *(arr + 1) = arr[1]

	printf("ptr = %d\n", ptr);
	printf("arr[0] = %d\n", arr[0]);
	printf("*(ptr + 1) = %d\n", *(ptr + 1)); //ptr에 sizeof(*ptr)을 더한 값
	printf("ptr[1] = %d\n", ptr[1]);
	printf("*(arr + 1) = %d\n", *(arr + 1)); //arr에 sizeof(arr[0])를 더한 값
	printf("arr[1] = %d\n\n", &arr[1]);
}

void example3() {	// 멘탈주의
	int arr[2][3] = {
	{1, 2, 3},
	{4, 5, 6}
	};

	// int(*row)[3] = arr : 길이가 3인 배열 포인터 선언 후 arr[0]의 주소값 대입
	// row = arr[0]의 값이 arr + 2 = arr[2] 미만일때까지 반복하고
	// row++ = row += 1 : row값을 1 증가시킴

	// int *col = *row : 포인터 선언 후 *row = 대입

	for (int(*row)[3] = arr; row < arr + 2; row++) {
		for (int* col = *row; col < *row + 3; col++) {
			printf("%d ", *col);
		}
		printf("\n");
	}
}

int main(void) {
	printf("예제 1번\n");
	example1();
	printf("\n");
	printf("예제 2번\n");
	example2();
	printf("\n");
	printf("예제 3번\n");
	example3();
	printf("\n");
}

예제 3번을 그림으로 표현하면 아래와 같습니다.

(진짜 개 어렵다)