但sizeof(*p)相当于sizeof(int);
2:sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。
3:对于静态数组,sizeof可直接计算数组大小;
例:int a[10];char b[]="hello";
sizeof(a)等于4*10=40;
sizeof(b)等于6;
注意数组名做函数参数传递时退化为指针。
void fun(char p[])
sizeof(p)等于4
经典问题:
double* (*a)[3][6];
cout<<sizeof(a)<<endl; // 4 a为指针
cout<<sizeof(*a)<<endl; // 72 *a为一个有3*6个指针元素的数组
cout<<sizeof(**a)<<endl; // 24 **a为数组一维的6个指针
cout<<sizeof(***a)<<endl; // 4 ***a为一维的第一个指针
cout<<sizeof(****a)<<endl; // 8 ****a为一个double变量
问题解析:a是一个很奇怪的定义,他表示一个指向double*[3][6]类型数组的指针。既然是指针,所以sizeof(a)就是4。
既然a是指向double*[3][6]类型的指针,*a就表示一个double*[3][6]的多维数组类型,因此 sizeof(*a)=3*6*sizeof(double*)=72。同样的,**a表示一个double*[6]类型的数组,所以 sizeof(**a)=6*sizeof (double*)=24。***a就表示其中的一个元素,也就是double*了,所以sizeof(***a)=4。至于****a,就是一个 double了,所以sizeof(****a)=sizeof(double)=8。
4:当操作数是具体的字符串或者数值时,会根据具体的类型进行相应转化。
例如: sizeof(8) = 4; //自动转化为int类型
sizeof(8.8) = 8; //自动转化为double类型,注意,不是float类型
sizeof("ab") = 3 //自动转化为数组类型,
//操作数的存储大小是3,不是2,因为加上了最后的'\0'符
//有资料说,会自动转化为指针类型(Linux为4)
//可能和操作系统与编译器有关系
unsigned short i = 0x1234; //这个和第五点貌似冲突
printf("sizeof(i+1):%d\n",sizeof(i+1)); //结果为4,自动转化为int类型
printf("sizeof(i=i+1):%d\n",sizeof(i=i+1)); //结果为2,i本身值不变仍为0x1234。
5:根据C99规范,sizeof是一个编译时刻就起效果的运算符,在其内的任何运算都没有意义.
在网上看到的代码:
int i=1;
cout<<sizeof(++i)<<endl; //结果为4 int类型4个字节
cout<<i<<endl; //结果为1 在执行了上面的操作后i仍为1 ++i没有执行
改变一下:
int i=1;
cout<<sizeof(i+=1)<<endl;
cout<<i<<endl;
这次结果仍然相同!!
int i=1;
int j=2;
cout<<sizeof(i=j+1)<<endl;
cout<<i<<endl;
结果同上。
int i=1;
double j=2;
cout<<sizeof(j=i+1)<<endl; //结果为8
int i=1;
double j=2;
j = sizeof(++i + ++i); 在编译的时候被翻译成
j=sizeof((++i + ++i 的数据类型)) 也就是 j = sizeof(int);
cout<<i<<endl; //结果为1
int i=1;
double j=2;
cout<<sizeof(j=i+1)<<endl; //结果为8 double类型8个字节
cout<<i<<endl; //结果为1
sizeof里面的运算始终没有执行。因此我们可以得到这样一个结论:只要sizeof的参数的表达式没有错误,其结果为从左边数第一个变量的类型大小值。