본문 바로가기

Today I Learned

23.01.19 - 포인터 기초

기존에 변수를 선언해서 메모리에 접근하는 것을 이름으로 접근하는 것이라고 하면

포인터 변수는 주소로 접근하는 것이라고 할 수 있다.

왜 포인터를 이용해야 하냐면 전역 변수는 한 파일에서만 이용 가능하기 때문에 

C++에서 이름으로 접근하는 것에 대한 한계가 있기 때문이다.

 

이 메모리 주소는 실제 메모리 주소는 아니고 OS가 가상 메모리 주소를 실제 메모리 주소와 매칭시켜 준 것이다.

0번지는 접근할 수 없는 null포인터의 주소이며 32비트에서 0x1 ~ 0xffffffff 로 주소를 표현할 수 있다.

주소를 1바이트 단위로 표현하며 주소의 크기가 32비트니까 2의 32승, 4GB 까지 표현이 가능하다.

(주소가 1증가할때 마다 1비트가 아니라 1바이트가 커지는 것이다. 헷갈려서 강조표시)

64비트는 2의 64승 16TB까지 주소를 표현할 수 있다.

 

포인터에 정수를 더하면 포인터 자료형의 크기만큼 이동한다.

	int a = 10;
	int* pa = &a;

	cout << pa << "\t" << pa+1;
    //출력:001EFDA0      001EFDA4

int형의 크기 4바이트만큼 주소가 커졌다.

 

그리고 포인터로 허가받지 않은 메모리를 읽는건 가능하지만 쓰는 것은 불가능하다.

	int a = 10;
	int* pa = &a;

	cout << pa + 1; //(o)
	*(pa + 1) = 20; //(x)