1. 무조건 스택 프레임이랑 힙이랑 그림 그리면서, 화살표로 포인터가 어디 가리키는지 일일히 그림 그리면서 공부하세요
2. 역참조 연산자 *는 배열 원소 접근 연산자 []보다 우선순위가 낮음. 특히 다차원 배열 연산 할 때 *Array2D[3] = 4; 같은 식으로 썼다가 메모리 오류나는 경우가 많으니 반드시 연산자 우선순위 먼저 참고하세요.
포인터를 이해하려면 자료형과 메모리에 대해 이해를 해야 쉽기 때문에 그림을 그리라는 의미임
자료형이 int, char 이런것만 자료형인게 아니라, 온갖 메모리 덩어리들에 이름만 붙이면 자료형이 되기때문에,
그러한 이름붙은 메모리 덩어리를 가리키는 포인터 변수는 그림을 그려서 봐야 더 쉽게 이해할 수 있음
자료형에 대해 이해한다면 포인터를 이해하기 쉬워
포인터는 선언될때 어떤 자료형을 가리키는지 정의하게 되어있어.
여기서 자료형은 메모리 뭉탱이를 의미해
char* p; 라는 포인터 변수가 있다고 하면
int d;가 int라는 자료형의 변수인것처럼, p는 결국 char*라는 자료형의 변수임.
배열의 자료형은
char arr[10]; 이렇게 있으면 arr라는 변수의 자료형을 명칭하려면 [10]을 앞으로 넘겨서 char[10]이라는 자료형을 가지고 있다고 말해.
다만 배열에서 [ ]를 서브스크립트 연산자라고 하는데, 이건 문법상 변수 뒤에 있어야 함.
그래서
char *parr[10] 이것은 char* p[10]; 즉 자료형이 char*[10]인 parr라고 하는 배열 변수임. (포인터의 배열)
char (*p)[10] 이것은 char[10]* p; 즉 자료형이 char[10]* 이며 char[10]의 자료형의 메모리를 가리키는 포인터 변수임 (배열 포인터)
포인터의 배열 -> 포인터가 여러개 모여있는 배열
배열포인터 -> 배열 메모리를 가리키는 포인터 단하나 변수