본문 바로가기

프로그래밍/C 기초

[C언어 강좌] #34 포인터의 타입

저번시간에 포인터의 선언 방법을 배웠습니다.

이번에는 포인터를 선언할떄 붙는 타입에 대해서 더 알아봅시다.


int형 변수의 주소값을 저장하려면 int형 포인터를 선언하면 되고

double형 변수의 주소값을 저장하려면 double형 포인터를 선언하면 됐었습니다.

그리고 unsigned가 붙어도 마찬가지로 unsigned int는 unsigned int형 포인터 변수가 필요합니다.


그럼 포인터변수의 크기는 몇바이트일까요?

sizeof연산자로 출력해보니 4바이트라고 나왔습니다.

포인터변수가 int형의 주소를 담을수 있는것이라서 4바이트일까요?



포인터변수가 가리키고있는 곳을 double형으로 바꾸고 double형 포인터로 바꿔도 4바이트로 출력됩니다.

여기서 알수있는것은 포인터변수의 크기는 가리키고 있는 변수의 크기와는 연관이 없습니다.

단지 32비트 시스템에서는 4바이트고 64비트 시스템에서는 8바이트의 크기를 갖게됩니다.

32비트에서는 주소값을 32비트로 표현해야되고 64비트에서는 64비트로 표현해야되기 때문입니다.


저는 32비트 시스템에서 컴파일했기때문에 4바이트로 나왔습니다.

64비트로 컴파일했으면 8바이트로 출력됐을겁니다.


그렇다면 포인터변수를 선언할때 자료형의 타입은 왜 써야하는걸까요?




우리는 포인터를 사용할때 맨 앞자리의 주소밖에 사용하지 않습니다.

하지만 int형의경우 0x12ff70에 존재하면 0x12ff70~0x12ff73까지가 int형변수의 범위입니다.


하지만 포인터변수는 맨 앞자리의 주소만 가지고 어디까지 읽어야하고 그것을 어떻게 해석해야 하는지 알수가 없습니다.

그렇기때문에 포인터변수에 타입을 지정해줘야 하는것입니다.

int형 포인터 변수는 저장된 주소를 시작으로 해서 4바이트를 읽고 그것을 정수로 해석합니다.

그리고 그것을 알려주기 위해서 포인터변수의 타입이 필요한것입니다.


즉 포인터의 형은 메모리 공간을 참조할때 접근 기준을 마련하기 위해서 존재하는것입니다.