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 프로그램으로 컴파일했을 경우의 결과는 아래와 같다.
64 Bit 프로그램으로 컴파일 했을 경우는 아래와 같다.
포인터 변수 자료형들이 같은 크기를 가지는 이유와 32/64 Bit에서의 크기가 다른 이유를 정리해보겠다.
각각의 자료형은 해당 자료를 표현하기 위해 그 범위만큼의 크기를 가진다.
아래 표 참고.
정수형 자료형 |
크기 |
자료형 값의 범위 |
char |
1byte |
-128 이상 +127 이하 |
short |
2byte |
-32,768 이상 +32,767 이하 |
int |
4byte |
-2,147,483,648 이상 |
long |
4byte |
-2,147,483,648 이상 |
long long |
8byte |
-9,223,372,036,854,775,808 이상 |
실수형 자료형 |
크기 | 자료형 값의 범위 |
float |
4byte |
± 3.4 x 10-37 이상 |
double |
8byte |
± 1.7 x 10-307 이상 |
long double |
8byte 이상 |
double 이상의 표현 범위 |
char 자료형은 위 표에서 확인할 수 있듯 1 Byte의 크기를 가진다.
1 Byte = 8 Bit이므로 표현할 수 있는 범위는 아래 그림과 같다.
char 자료형의 경우 총 표현할 수 있는 범위는 0~255. 총 256가지 경우를 표현한다.
다음으로 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 |