- 指针变量的 sizeof 值与指针所指的对象类型没有任何关系 , 与指针申请多少空间没有关系 , 所有的指针变量所占内存大小均相等 。
- 如果使用 32 位编译器编译得到程序是 32 位 , 那么在 64bits 系统下 , 指针变量大小仍然是 4 个字节 。
void fun1(){}int fun2(){ return 0;}double fun3(){ return 0.0;}cout << sizeof(fun1()) << endl; //错误!无法对void类型使用sizeofcout << sizeof(fun2()) << endl; //fun2()返回值类型为int , 输出4cout << sizeof(fun3()) << endl; //fun3()返回值类型为double , 输出8
- 注意:不能对返回 void 函数和函数指针进行 sizeof 取值 。
int A[3][5]; char c[]="abcdef"; double*(*d)[3][6]; cout<<sizeof(A)<<endl; //输出60 cout<<sizeof(A[4])<<endl; //输出20 cout<<sizeof(A[0][0])<<endl;//输出4 cout<<sizeof(c)<<endl; //输出7 cout<<sizeof(d)<<endl; //输出4 cout<<sizeof(*d)<<endl; //输出72 cout<<sizeof(**d)<<endl; //输出24 cout<<sizeof(***d)<<endl; //输出4 cout<<sizeof(****d)<<endl; //输出8
A 的数据类型是 int[3][5] , A[4] 的数据类型是 int[5] , A[0][0]数据类型是 int。所以:sizeof(A)==sizeof(int[3][5])==3*5*sizeof(int)==60sizeof(A[4])==sizeof(int[5])=5*sizeof(int)==20sizeof(A[0][0])==sizeof(int)==4
如果字符数组表示字符串 , 数组末自动插入 '' , 所以 c 的数据类型是 char[7] , 所以 sizeof(c)=sizeof(char[7])==7 。d 是一个很奇怪的定义 , 他表示一个指向 double*[3][6] 类型数组的指针 。既然是指针 , 所以 sizeof(d) 就是4 。
既然 d 是执行 double*[3][6] 类型的指针 , *d 就表示一个 double*[3][6] 的多维数组类型 , 因此 sizeof(*a)=3*6*sizeof(double*)=72。
**d 表示一个 double*[6] 类型的数组 , 所以 sizeof(**d)=6*sizeof (double*)=24 。
***d 表示其中的一个元素 , 也就是 double* , 所以 sizeof(***d)=4。
****d 是一个 double , 所以 sizeof(****d)=sizeof(double)=8 。
当数组作为函数形参时 , 下面输出结果应该是多少呢?
int GetStrLength(char str[]){ return sizeof(str);}int main(){ char szStr[] = "abcdef"; cout<< GetStrLength() << endl; return 0;}
输出不是 7 , 这里函数参数 str[] 已不再是数组类型 , 而是蜕变成指针 , 我们调用函数 GetStrLength() 时 , 程序会在栈上分配一个大小为 7 的数组吗?不会!数组是“传址”的 , 调用者只需将实参的地址传递过去 , 所以 str 自然为指针类型 (char*) , 输出值为:4。- 数组的大小是各维数的乘积*数组元素的大小 。
- 向函数形参传递数组 , 数组将会退化为指针 , 失去原来数组的特性 。
理论上 , int 占 4byte , char 占一个 byte , 那么将它们放到一个结构体中应该占 4+1=5byte ;但是实际上 , 通过运行程序得到的结果是 8byte。
#include<stdio.h>struct{ int x; char y;}Test;int main(){ printf("%dn",sizeof(Test)); // 输出8不是5 return 0;}
结构体的大小跟结构体成员对齐有密切关系 , 而并非简单地等于各个成员的大小之和!比如对如下结构体两个结构体 A、B 使用 sizeof 的结果分别是:16,24 。可以看出 sizeof(B) 并不等于 sizeof(int)+sizeof(double)+sizeof(int)=16。
推荐阅读
- Java开源框架之SpringMVC原理及源码解析
- C++构造函数的三种写法
- 外包面试之旅
- 苦尽甘来茶道人生,茶道之真饮茶之人要怀有颗真心
- 行走茶山之寻找革登茶,革登茶山
- PLC编程语言之争:谁才是"一哥"
- 大英博物馆的镇店之宝 大英博物馆三大镇馆之宝
- 宇宙生命之谜提出问题并解决 宇宙生命之谜主要讲述了什么没有生命存在的原因
- 中国历史上夏朝之前是什么朝代 夏朝之前还有什么朝代
- 夏威夷火山喷发视频 夏威夷火山之谜