C에 대해서 공부하는 것을 비공개로 정리 중이었는데 블로그의 글들이 공개글이 없어서 갱신되지 않는 것 같아 TIL에 남기기로 했다.
이 글은 오늘의 C 공부 내용에 대해 정리하기로 한다.
참조 : 해당 값을 갖는 주소를 대입한다.
역참조 : 해당 주소에 있는 값을 대입한다.
int num1 = 1;
int num2 = 2;
int* iPtr = &num1; // 참조
*iPtr = num2; // 역참조
참조와 역참조는 자료형 뒤에 쓰이냐 또는 변수의 앞에 쓰이냐에 따라 그 쓰임새를 구별할 수 있다.
포인터의 크기는 해당 운영체제에 따라 달라진다
32비트 환경에서는 포인터 하나의 크기가 4바이트이며,
64비트 환경에서는 포인터 하나의 크기가 8바이트이다.
포인터도 결국 주소를 갖는 "값"으로 볼 수 있으며 따라서 자료형이 뭐든간에 그 자료형에 해당하는 값을 가리키는 주소를 담고 있는 하나의 "값"으로서 해당 운영체제에 따른 바이트공간을 갖는 것 뿐이다.
포인터는 "주소"가 아니라 "주소를 담는 변수"라고 생각해야한다.
포인터가 갖는 주소가 가리키는 값의 자료형을 임시변경할 수 있도록 돕는 캐스팅기법이다.
포인터 자료형을 완전 변환하는 것도, 해당 주소가 가리키는 변수의 자료형을 변환하는 것도 아니다.
그냥 읽어들일 때 그 자료형을 어떤 자료형으로 읽어들일 지를 바꾸는 것이다.
int* ptr = &num ; 으로 작성되어 있을 때 바로 추측가능한 것은 num이 int형일 것이라는 것과 ptr은 int 자료형 변수의 주소를 갖고 있는 포인터라는 것이다.
이 때, ptr = (char*)num + 1;이라고 한다면,
해당 num 자료형을 1바이트만큼 더한 주소 (num이 이 때 배열의 첫주소라고 가정)를 int가 아닌 char로 간주하고 읽어들이는 것이다. (어렵지만 자주 사용하면서 익혀야겠다.)