일반적인 자료형(char, int, float, double 등등...)와 다르게 포인터 변수 선언 시, 자료형들은 동일한 크기를 가진다. 이번 포스팅은 포인터 자료형이 동일한 크기를 가지는 이유에 대해 설명한다.


예를 들어, 아래의 코드를 컴파일해보자.

 

 


이 코드를 32 Bit 프로그램으로 컴파일하였을 경우는 아래와 같다.

 


 

다음으로 64 Bit 프로그램으로 컴파일하였을 경우 아래와 같다.

 

 


왜 동일한 크기를 가지는 것일까? 그리고 32/64 Bit에서 포인터 크기가 변한 이유는 무엇일까? 모든 자료형이 그렇듯이 각각의 자료형은 해당 자료 표현을 위해 그 범위 만큼의 크기를 가진다. char 자료형은 1 Byte의 크기를 가진다. 즉, 1 Byte = 8 Bit이므로 표현할 수 있는 범위는 아래 그림과 같을 것이다. 아래 그림에서 char 자료형을 예를 들어 보자.

 

 


총 표현할 수 있는 범위는 0~255까지 256의 경우의 수를 표현하며, 이를 ASCII 코드에 대응하여, 지정된 문자를 출력한다.

다음으로, int 자료형의 경우의 수를 예를 들어보자.

 

 


32 Bit 프로그램 기준으로 int 자료형은 4 Byte의 크기를 가지며, 이는 총 32 Bit으로 4,294,967,296개의 경우의 수를 가진다. 이처럼 자료형이 고유의 크기를 가지는 이유는 그만큼 표현할 수 있는 경우의 수에 해당하는 크기를 의미하며, 따라서 각각의 자료형마다 크기가 다르게 지정되어 있다는 것을 알 수 있다.


다시 돌아가서 포인터 자료형의 경우, char, int, double 자료형과는 다르게 모든 포인터 자료형에 대하여 동일한 크기를 가진다. 포인터 변수는 주소 값을 넣는 자료형이라는 것은 다들 알고 있을 것이다. 즉, 주소 값을 저장하기 위한 자료형이기 때문에 OS Bit에 따른 해당 메모리 주소 값을 모두 포인터 변수로 넣을 수 있는 경우의 수가 필요한 자료형이어야 할 것이다.


32 Bit 프로그램을 예로 들어보자. 32 Bit의 경우 표현하여 사용 가능한 메모리양은 4,294,967,296 경우의 수이므로, OS에서 총 가용할 수 있는 메모리는 4 GB(4,294,967,296 Byte)가 된다. 32 Bit에서 포인터가 4 Byte인 이유는 여기서 분명해진다. 가용할 수 있는 모든 메모리의 경우의 수를 표현하기 위해서는 4 Byte 크기의 자료형이어야 때문이다.

그렇다면 64 Bit의 경우는 어떨까? 총 가용할 수 있는 메모리양은 이론상으론 ​16 EB(18,446,744,073,709,551,616 Byte)​일 것이다. 즉, 산술적으로 따져봤을 때 16 EB까지 지원이 가능한 것이지만, 현재 OS에서는 이 정도까지의 대용량 메모리는 지원하지 않는 것으로 알고 있다.

 



출처: https://programist.tistory.com/entry/C-언어-모든-포인터-변수-자료형이-똑같은-크기를-가지는-이유?category=692863 [Programist's Laboratory]