#include <stdio.h>
#define R 10
#define C 5
int main()
{
int(*p)[R][C];
//5*10=50개의 배열을 갖는 하나의 포인터 p선언.
int arr[10][5];
printf("%p\n", arr); //arr는 int[10][5]
printf("%p\n", arr+1);
//arr+1은 int[5]를 가리키는 포인터 int[5]* 포인터의 요소가 int[5]일뿐.
//int arr[3] 하고 arr+1이 int를 가리키는 포인터라는 것과 같은 이유
printf("%d\n", sizeof(arr)); //arr의 크기는 int[10][5] 배열의 크기 4*5*10
printf("%d\n", sizeof(arr+1)); //arr+1의 크기는 int[5]를 가리키는 포인터의 크기 결국 64비트
printf("%d\n", sizeof(p)); //p는 int*
printf("%d\n", sizeof((*p)+1)); //*p는 int[r][c]
printf("%d\n", sizeof(*p)[R]); //(*p)[r]은 int[r]
printf("%d\n", sizeof(*p)[R][C]); //(*p)[R][C]는 int
//p는 포인터다. int[R][C] 를 가리키는 포인터
//*p 이 포인터 p를 역참조 한 것이므로 int[R][C] 값 그 자체다
//(*p)[R]은 p를 역참조 한 int[R][C]에서 R번째 행 int[C]를 나타낸 것이다.
//(*p)[R][C]는 p를 역참조한 int[R][C]에 담긴 값 int를 나타낸 것이다.
return 0;
}
배열 시작주소 + 1 연산을 하면 해당 값은 배열 안의 요소를 가리키는 포인터가 된다!!
ex)
int arr[3];
arr+1은 int* !!!!
int arr[5][10];
arr+1은 int[10]*!!!
결국 둘다 크기는 8byte(64비트 컴퓨터, 포인터 변수의 크기)
c언어에서
(무언가)* 자료형 란
(해당 포인터가 가리키고 있는 요소의 자료형)* 이다.
ex)
int[5]*은
int[5]를 가리키고 있는
포인터이다.
'공부 > 이모저모' 카테고리의 다른 글
Sequential VS Concurrency (0) | 2021.11.08 |
---|---|
교착 상태(deadlock) vs 병목 현상(bottle neck) (0) | 2021.11.08 |
C언어 배열이름에 &붙이는 경우(&배열이름??) (0) | 2021.10.19 |
행렬의 덧셈과 곱셈 (행렬이란? 행이란 열이란) (0) | 2021.10.18 |
주요 포트번호 및 서비스 정리 (FTP,HTTP,SSH,텔넷,SMTP...) (0) | 2021.10.01 |