sizeof并不是C语言和C++语言中的一个函数,而是一个关键字,一个操作符。
它的作用是返回一个对象或者类型名的长度,也就是说这个对象或者类型所占的内存字节数。它的返回值类型为size_t(usinged int),长度的单位是字节。
1)对基本数据类型运用sizeof操作,得到其占用内存的字节数。
如
- int a;
- double d;
- printf("%d",sizeof a);
- printf("%d", sizeof d);
它的输出是4 和 8,因为int在内存中占用4个字节,double在内存中占用8个字节。
2)对指针做sizeof操作,得到的将是存放指针所需的内存大小。
- char c = 'c';
- int a = 10;
- double d = 3.14;
- char *cp = &c;
- int *ap = &a;
- double *dp = &d;
- printf("%d %d %d",sizeof (cp),sizeof (ap),sizeof (dp)); // 4 4 4
- printf("%d %d %d",sizeof (*cp),sizeof (*ap),sizeof (*dp)); // 1 4 8
对于32位的及其来说,每个指针的占用的内存大小都是一个字,亦即32位,也就是4字节,所以第一行输出的是4 4 4 ,对于第二行不用多说,对指针解引用,就是输出的实际上是每个变量的sizeof ,1 4 8
3)对数组做sizeof操作等效于将对其元素类型做sizeof操作的结果乘上数组元素的个数。
- double a[]={2,4,6,8};
- double *p = a;
- printf("%d %d %d",,sizeof (a),sizeof (*p),sizeof (p)); //32 8 4
第一个sizeof是输出数组a在内存中的总长度;第二个sizeof实际是输出数组a的第一个元素(p指针指向其第一个元素)2在内存中所占的字节数,因为是double类型,所以输出8;第三个sizeof是输出指针p在内存中所占的字节数,如2)所示,为四个字节。
4)对结构体做sizeof操作时得到的是整个结构体所占用内存的大小,但是需要注意的是,结构体构造的时候不足4字节的类型在内存中实际占用了4个字节,这就是所谓的内存对齐。
- struct c
- {
- char c;
- int a;
- double d;
- }cobing;
- printf("%d",sizeof (cobing)); //16
为什么是16而不是13呢?这是因为虽然char是一个字节,但是在结构体定义的内存中它占用了整整32位,也就是4个字节,加4个字节的int,和8个字节的double,就是16个字节。
对于sizeof始终要记住的就是:它对某个对象或者类型操作,得出的是这个对象或类型在内存中实际占用的字节数,返回的是一个usinged int类型的整数。以上分析均是针对32位的机器。