드디어 개발자 커터기 포인터에 진입했습니다.
찬찬히 개념을 잡아봅시다.
-포인터가 도데체 뭡니까?
포인터는 주소를 저장하는 변수입니다.
-그러면 주소는 뭐죠?
메모리 안에는 0과 1로 비트단위로 영역이 있을텐데 위치에 대한 값이 있다고 생각하시면 됩니다. 포인터를 활용하면 int a 에 대하여 a에 접근할때 메모리상에 주어지는 주소로도 접근하는 다른 방법입니다.
-nullptr은 뭐죠?
사실상 0 이지만 아무것도 가리키지 않는 주소라고 생각해 줍시다.
-주소의 단위는 뭔가요?
예를 들어 말도 안되지만 메모리상 100번째 주소와 101번째 주소가 있다면 이 사이의 범위는 1byte입니다. 포인터는 byte단위로 읽을수 있는것이죠!
#include <stdio.h>
int main()
{
// 포인터 변수
// 주소를 저장하는 변수
// 자료형 + * 변수명
int i = 100;
float f = 3.f;
int* pInt = &i;
//pInt주소 값으로 가서 값을 참조한다.
*pInt = 400; // i = 400
int* pInt2 = (int*)&f;
i = *pInt2; // i = 1077936128
return 0;
}
코드에서 변수 pInt타입에 *가 붙었습니다. 이로써 int자료형을 가르키는 변수가 됩니다.
왜 int는 int*로 저장할까요?
주소는 위치정보만 가지고 있기 때문에 얼마나 읽어야 할지 모르기 때문에 int(4byte) 까지 읽겠다는 것을 내포하고 있습니다.
자신이 가르킬 주소의 타입을 정해 두었다고 생각합시다.
만약 float 변수를 강제 캐스팅해서 int*에 넣으면 float타입으로 지정된 데이터를 int 타입의 체계로 읽어서 잘못된 값을 가져오게 됩니다.
요약) 해당 포인터에게 전달된 주소를 해석하는 단위