이것의 결과를 보면 pnum의 실질적인 값은 num의 주소이며, num의 값을 가리키고 있음
여기서 &연산자는 &오른쪽에 오는 피연산자의 주소값을 반환하는 연산자이다.
그리고 포인터도 가리키고자하는 변수의 자료형에 따라 포인터변수도 그에 맞춰 다르게 선언한다.
ex) duble num;
double *pnum; // double형 포인터 변수 pnum
char cha;
char *pcha; // char형 포인터 변수 pcha
사실 주소값은 동일한 시스템에서 그 크기가 동일하며, 모두 정수의 형태를 띈다. 하지만 모두 다 똑같이 int형으로 포인터 변수를 선언한다면, 다른 사용자나 자신 그리고 시스템은 해당 포인터 변수가 무엇을 가리키는건지 알기 힘듬.
그래서 *이 붙은 자료형은 포인터 형이라 한다. 물론 포인터도 값을 저장하는 변수이기에 자료형의 범주에 포함된다.
또 하나의 사실은 *의 위치는 크게 상관이 없다.
ex) int* pnum;
int *pnum;
int * pnum;
위처럼 프로그래머 마음대로 골라 쓰면됨.
*연산자는 포인터가 가리키는 메모리공간에 접근할 때 사용되는 연산자이며, 포인터 변수를 이용해 포인터 변수가 가리키는 변수의 값을 바꿀 수도 있다.
널 포인터(NULL Pointer)
포인터를 선언만 하고, 초기화해주지 않으면, 내부에는 쓰레기값으로 채워지는데, 이는 그 포인터 변수가 어디를 가리킬지 아무도 알 수 없다. 설령 포인터가 가리키는 주소가 메모리상에서 아주 중요한 공간이라도 모를 것이다. 거기다가 아래의 코드처럼 *연산으로 임의의 수를 저장하면, 프로그램에 치명적인 결과를 가지고 올 수 있다.
그렇다면 초기값을 대충 1234로 해야하나? 이것도 안된다. 왜냐하면 이 1234번지가 메모리의 어디에 있는지 알 수 없다. 고로 쓰레기 값으로 채우는 것과 다를 바없다. 그래서 NULL값을 이용하는 것이다.
이 둘이 의미하는 바는 같다 왜 0과 NULL이 같은 의미를 지니냐면 0은 아스키코드에서 NULL이기 때문이다. 그리고 0이라는 숫자가 들어가면 *pnum1이 0번지를 가리키진 않는다. 여기서 0(NULL)의 의미는 해당 포인터 변수는 아무것도 가리키고 있지 않다고 할 수 있다.