포인터는 기본적으로 특정 자료형을 통해 메모리 주소에 접근하기 위해 사용해야 하므로
int 변수에는 int 포인터, char 변수에는 char 포인터를 사용할 수 있으나
특정 자료형을 지정하지 않고 메모리 주소만 저장할 수 있는 void형 포인터도 있다.
생각해보면 함수도 void형 함수가 있는데 그거는 아무런 인자를 받을 수가 없어서
C언어에서 main함수를 만들 때 VS에서는 void형으로 자동 생성되는 거겠지
연산자의 우선 순위는 포인터 연산자가 더 낮으니 포인터 배열을 선언시 주의해야 한다.
ex) int a[10]; int (*pa)[10] = &a; 일 때 a[3]을 쳐서 접근하는거하고 (*pa)[3]으로 접근하던
똑같으나 *pa[3]으로 접근할 경우 a[3][0]으로 접근하는거나 마찬가지다.(오버플로우 발생)
이거는 *연산자의 우선순위 문제인데 이거는 연산자의 우선순위에 대해 다시 알아보자꾸나.
int *c[10]; // int *[10]의 자료형 c는 80바이트의 크기를 가진다. 배열 10개가 선언된 포인터배열
int *(*pc)[10] = &c // int *c의 주소를 저장한 포인터로 포인터배열의 포인터가 된다. 그래서 8byte
행여나 배열포인터하고 햇갈린다면 배열을 가리킬 수 있는 포인터가 배열포인터라는걸 기억하자
즉 int x[10]; int *(xp) = &x; 일 경우 int *(xp)가 배열포인터가 된다.
포인터만 해도 이렇게 아스트랄한데 객체지향으로 넘어가면 머리가 더 호롤롤롤롤 되겠지?