
char a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
a = 100 을 기준으로 상대주소를 생각해보자 100
printf("a는 %p\n", a); // 0095F6EC {100}
a 는 첫번째 덩어리의 주소(4개짜리 한 덩어리)
printf("a+1는 %p\n", a + 1); // 008FFA08 {104}
a+1 은 4개짜리 덩어리를 기준으로 하나 다음 덩어리의 주소
printf("a[0]는 %p\n", a[0]); // 0095F6EC {100}
a[0]는 첫번째 덩어리의 주소(1 하나짜리 덩어리)
printf("a[1]는 %p\n", a[1]); //0095F6F0 {104}
a[1]는 두번째 덩어리의 주소 (5 하나짜리 덩어리)
printf("a[0]+1는 %p\n", a[0]+1); //0095F6ED {101}
a[0]는 1이라는 값의 주소임 (1개짜리 덩어리)
+1을 하면 char단위의 하나 다음인 '2'가 있는 곳의 주소를 가리킴
printf("a[1]는 %p\n", a[1]); // 0095F6F0 {104}
printf("*(a+1)는 %p\n", *(a + 1)); //0095F6F0 {104}
printf("a+1는 %p\n", a + 1); // 008FFA08 {104}
printf("*(a+1)는 %p\n", *(a + 1)); //0095F6F0 {104}
a+1는 4개짜리 덩어리를 기준으로 하나 다음주소라서 {5,6,7,8}이 들어있는 4개짜리 덩어리의 시작주소*(a+1) 4개짜리 덩어리에서 다음 한 덩어리로 간 다음 하나 안의 값이라 {5}하나 들어있는 덩어리의 주소임printf("*a[1]는 %d\n", *a[1]); // 5
printf("*(a+1)는 %p\n", *(a + 1)); // '5'가 있는 곳에 있는 주소 {104}
printf("*(a+1)+1는 %p\n", *(a + 1)+1); // '6'이 있는 곳의 주소 {105}
printf("*((a+1)+1)는 %p\n", *((a + 1) + 1)); // '9'가 있는 곳의 주소 {108}
int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
int* p = a; // 대부분 컴파일러는 경고를 내거나 에러를 냄
int* casted_p = (int*)a; // 처럼 캐스팅을 해줘야함!
int(*q)[4] = a; //배열 포인터
printf("q+1는 %p\n", q+1); // {104}
printf("*(q+1)는 %p\n", *(q + 1)); // {104}
printf("**(q+1)는 %d\n", **(q + 1)); // 5