sizeof小结

1:int *p; sizeof(p)=4;

但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的参数的表达式没有错误,其结果为从左边数第一个变量的类型大小值。

posted @ 2015-06-22 21:32  xq_120  阅读(218)  评论(0编辑  收藏  举报