int array[4][3];
자료형 배열이름 [행] [열](배열 길이);
물리적인 메모리 구조는 1차원이지만 이해하기 쉽도록 2차원으로 그림을 그리는 것도 좋음
#include <stdio.h>
int main(void)
{
int array[2][2] = {10, 20, 30, 40};
printf("%x %x \n", array, array + 0); // ee7b1300 ee7b1300
printf("%x \n", array + 1); // ee7b1308
return 0;
}
#include <stdio.h>
int main(void)
{
int array[2][2] = {10, 20, 30, 40};
printf("%x %x \n", array[0], &array[0][0]); // 0행의 대표 주소 즉, 0행 0열의 주소,
printf("%x %x \n", array[1], &array[1][0]); // 1행의 대표 주소 즉, 1행 0열의 주소
return 0;
}
// e123d300 e123d300
// e123d308 e123d308
#include <stdio.h>
int main(void)
{
int array[2][2] = {10, 20, 30, 40};
printf("%x %x %x \n", array[0], *(array + 0), *array);
printf("%x %x \n", array[1], *(array + 1));
return 0;
}
// e6754300 e6754300 e6754300
// e6754308 e6754308
array[0]가 값이 아니라 0행을 대표하는 주소인 것처럼, *array도 0행의 값이 아니라 0행을 대표하는 주소가 됨
ex)
#include <stdio.h>
int main(void)
{
int array[2][2] = {10, 20, 30, 40};
printf("%d %d \n", *&array[0][0], *&array[0][1]);
printf("%d %d \n", *&array[1][0], *&array[1][1]);
printf("------\n");
// 2차원 배열 요소를 먼저 연산하게 하고, 이후에 * 연산자로 값을 참조
// array[i] + n에서 +n은 선언된 자료형의 크기만큼 더하라는 의미
printf("%d %d \n", *(array[0] + 0), *(array[0] + 1));
printf("%d %d \n", *(array[1] + 0), *(array[1] + 1));
printf("------\n");
// \*(array + i) == array[0]이므로 여기에 +n을 한 후 * 연산자로 값을 참조
printf("%d %d \n", *(*(array + 0) + 0), *(*(array + 0) + 1));
printf("%d %d \n", *(*(array + 1) + 0), *(*(array + 1) + 1));
// 배열의 물리적 메모리는 한 줄로 되어 있음. *(array+0) 기준으로 12바이트 건너뛴 주소의 값
// 논리적 주소로는 0행이 아니지만, 물리적 주소는 한 줄로 이루어졌기에 접근이 가능
printf("%d \n", *(*(array+0) + 3)); // 40
return 0;
}
Reference
강의: 박정민, 『C 프로그래밍』, KOCW 한국산업기술대학교, 11강
교재: 박정민, 『열혈강의 C 언어 본색 명강의가 일으키는 C 언어 기적』, 프리렉 (2011), p298-323.