SH1R0_HACKER
C언어 :: 포인터 정리 (4) - 2차원 배열과 배열 포인터 본문
// 포인터 정리(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번을 그림으로 표현하면 아래와 같습니다.
(진짜 개 어렵다)
'Programming Language > C' 카테고리의 다른 글
C언어 :: 포인터 문제 (3) (0) | 2021.01.17 |
---|---|
C언어 :: 포인터 정리 (5) - 포인터 배열 (0) | 2021.01.17 |
C언어 :: 포인터 정리 (3) - 배열 포인터 (0) | 2021.01.16 |
C언어 :: 포인터 문제 (2) (0) | 2021.01.16 |
C언어 :: 포인터 정리 (2) - 배열과 포인터의 관계 (0) | 2021.01.16 |