[C] 포인터 변수 자료형이 모두 같은 크기를 가지는 이유

프로그래밍/C · 2020. 11. 30. 04:28
printf("(void *)    sizeof : %d\n", sizeof(void *));
printf("(char *)    sizeof : %d\n", sizeof(char *));
printf("(short *)   sizeof : %d\n", sizeof(short *));
printf("(int *)     sizeof : %d\n", sizeof(int *));
printf("(long *)    sizeof : %d\n", sizeof(long *));
printf("(float *)   sizeof : %d\n", sizeof(float *));
printf("(double *)  sizeof : %d\n", sizeof(double *));

 

위 코드를 32 Bit 프로그램으로 컴파일했을 경우의 결과는 아래와 같다.

 

32 Bit

64 Bit 프로그램으로 컴파일 했을 경우는 아래와 같다.

64 Bit

포인터 변수 자료형들이 같은 크기를 가지는 이유32/64 Bit에서의 크기가 다른 이유를 정리해보겠다.

 

각각의 자료형은 해당 자료를 표현하기 위해 그 범위만큼의 크기를 가진다.

 

아래 표 참고.

 

정수형 자료형

크기

자료형 값의 범위

char

1byte

-128 이상 +127 이하 

short

2byte

-32,768 이상 +32,767 이하

int

4byte

-2,147,483,648 이상 
+2,147,483,647 이하

long

4byte

-2,147,483,648 이상 
+2,147,483,647 이하

long long

8byte

-9,223,372,036,854,775,808 이상
+9,223,372,036,854,775,808 이하

 

실수형 자료형

크기 자료형 값의 범위

float

4byte

± 3.4 x 10-37 이상
± 3.4 x 10+38 이하

double

8byte

± 1.7 x 10-307 이상
± 1.7 x 10-308 이하

long double

8byte 이상 

double 이상의 표현 범위

 

char 자료형은 위 표에서 확인할 수 있듯 1 Byte의 크기를 가진다.

1 Byte = 8 Bit이므로 표현할 수 있는 범위는 아래 그림과 같다.

 

char 표현 범위

char 자료형의 경우 총 표현할 수 있는 범위는 0~255. 총 256가지 경우를 표현한다.

 

다음으로 int 자료형의 표현 범위를 살펴보자.

int 표현 범위

32 Bit 기준으로 int 자료형은 4 Byte 크기를 가지며, 이는 32 Bit. 0~4,294,967,295. 총 4,294,967,296가지 경우를 표현한다.

 

자료형의 크기는 해당 자료형이 표현할 수 있는 경우의 수에 해당하는 크기를 의미한다. 그렇기 때문에 각각의 자료형마다 다른 크기가 지정되어있다.

 

포인터의 자료형의 경우는 일반적인 char, int, double 자료형과는 다르게 모든 포인터 자료형이 동일한 크기를 가진다.

 

포인터 변수는 주소 값을 넣는 자료형이다.

 

즉, 포인터 변수는 주소 값을 저장하기 위한 자료형이기 때문에 OS Bit에 따른 메모리 주소 값들을 모두 포인터 변수로 넣을 수 있는 경우의 수에 맞는 크기의 자료형이어야 한다는 의미다.

+ CPU의 메모리 접근을 위한 주소가 OS Bit만큼 가능하기 때문에 포인터 자료형의 크기도 해당 OS Bit가 된다.

 

32 Bit로 예를 들어보겠다.

 

32 Bit의 경우 표현 가능한, 사용 가능한 메모리 크기는 4,294,967,296이다. 그러므로 OS에서 총 가용할 수 있는 메모리는 4,294,967,296 Byte(=4 GB)가 된다.

 

이제 32 Bit에서 포인터가 4 Byte인 이유를 알 수 있다.

 

가용할 수 있는 모든 메모리의 경우의 수를 표현하기 위해서는 4 Byte 크기의 자료형이어야 하기 때문이다.

 

 

결론: 포인터 변수 자료형이 모두 같은 크기를 가지는 이유는 포인터 자료형의 크기가 해당 OS Bit가 되기 때문이다.

(가용할 수 있는 모든 메모리에 경우의 수를 표현하기 위해 해당 OS Bit 크기의 자료형이 된다.)

'프로그래밍 > C' 카테고리의 다른 글

[C] 댕글링 포인터(Dangling Pointer)  (0) 2021.02.21
[C] 이스케이프 시퀀스  (0) 2020.09.23
[C] 형식 지정자  (0) 2020.09.23
[C] 변수 초기화  (0) 2020.08.22
[C] return 0;를 사용하는 이유  (0) 2020.08.22