1. 포인터의 형

포인터는 메모리의 위치를 담는 변수를 말한다.

포인터 변수를 선언할때는 ***포인터의 형(type)***을 알아야 하고 이를 통해서 컴파일러는 메모리 공간을 참조하는 기준을 알 수 있게된다.

2. 포인터 변수를 선언할때 주의점(feat. NULL)

포인터를 통해서 변수나 함수가 저장되어있는 위치를 참조해서 들어갈 수 있고, 값의 조작이 용이해진다.

이러한 특징 때문에 가끔은 포인터를 선언만하고 초기화를 하지 않아서 치명적인 문제를 발생시킬 수 있다.

int *ptr;

위와 같이 선언만 한다면, ptr 이라는 포인터 변수에는 쓰레기 값이 들어갈 수 있다.

이 경우 잘못된 위치를 참조하게 되어서 ptr를 참조해서 값을 변경할 때나 값을 참조해서 가져올 때 중요한 시스템 변수를 변경시킬 수도 아니면 이상한 값을 가져올 수도 있다.(물론 컴파일러가 시스템변수와 같은 중요한 메모리는 접근 못하도록 막아주는 것으로 알고있다) 그러므로 만약 포인터 변수를 사용할것이지만, 나중에 유효한 주소값을 채워 넣으려면 0또는 NULL 로 채워줘야 한다.

int *ptr = 0 // int *ptr = NULL;

3. 포인터대상의 증감연산의 작동

int num = 3; //num이라는 int형 변수의 값은 3이며, 메모리 위치는 0x0001이라고 가정하자.
int *ptr = #
printf("%p",ptr++); //0x0005( sizeof(int)*1만큼 증가된 위치이다)
int arr[3] = {11, 22, 33};
int *ptr = arr;
printf("%d %d %d", *ptr, *(ptr+1), *(ptr+2)); //11 22 33

4. arr[i] == *(arr+i) 이다.

너무 당연한 말이지만, 한번 더 짚어보았다.

당연하기 때문에 이차원 배열에서의 다음의 값들도 같은 표현이다.

int arr[2][3];

arr[2][1] = 4;
(*(arr+2))[1] = 4;
*(arr[2]+1) = 4;
*(*(arr+2)+1) = 4;