c语言中包含char、int、float、double等基本数据类型,本节主要研究一下这些基本数据类型的特点及存储。
1、要用到的东西
a、sizeof函数,stdio.h中的函数,该函数接受一个变量,输出该变量的大小,单位为byte;
b、存储地址输出,用到&操作符,“&变量名”表示该变量的地址。
2、直接开始
废话不多说,直接上程序:
char a;
int b;
float c;
double d;
printf("a的地址为: %p [char] [%d Byte] \n",&a,(int)sizeof(a));
printf("b的地址为: %p [int] [%d Byte] \n",&b,(int)sizeof(b));
printf("c的地址为: %p [float] [%d Byte] \n",&c,(int)sizeof(c));
printf("d的地址为: %p [double] [%d Byte] \n",&d,(int)sizeof(d));
该程序段通过地址操作及sizeof函数,分别算出char、int、float、double类型变量的地址和大小,注意这4个变量是按顺序创建的,我们看看输出结果:
a的地址为: 0x7fff5fbff8db [char] [1 Byte]
b的地址为: 0x7fff5fbff8d4 [int] [4 Byte]
c的地址为: 0x7fff5fbff8d0 [float] [4 Byte]
d的地址为: 0x7fff5fbff8c8 [double] [8 Byte]
从输出结果可以看出各数据类型分别占用的空间:
char类型:1字节;
int类型:4字节
float类型:4字节
double类型:8字节
从地址方面来分析:
按照a、b、c、d创建的顺序可以发现,地址是按照从大到小的顺序来存储的,而如果重新打开程序的话,这些地址会发生变化,但是两个地址之间的差值不变。进一步分析,可以发现,char类型的数据虽然只有1byte,但是却占据4byte。
进一步验证:
char aa;
char bb;
int ff;
printf("char %p \n",&aa);
printf("char %p \n",&bb);
printf("int %p \n",&ff);
我通过在int类型前面创建两个char变量,结果又会如何呢?我们推测这两个char数据也是占有4byte,看看是否正确:
char 0x7fff5fbff8c7
char 0x7fff5fbff8c6
int 0x7fff5fbff8c0
结果是正确的。
3、结论
a、char数据的建立以4byte为单位
b、int/float数据以4byte为单位
c、double数据以8byte为单位
4、注意点
a、本次测试的环境为macbook air 64位,在其他环境下可能略有不同;
b、以上得出的结论并不是完整的推论,只是做简单的探讨,如考虑short等类型数据,char可能占有的就是2字节。
c、sizeof还有其他一些用途、不在本节讨论。