关于sizeof 指针和数组的讨论

来源:互联网 发布:js模拟鼠标轨迹 编辑:程序博客网 时间:2024/04/29 07:16
关于sizeof ,今天出来讨论下,希望感兴趣的童鞋都来一起讨论。
PS: 由于某些编译器的差异,这里只讨论VC++的情况
sizeof是C/C++下的运算符,可用于任何变量名、类型名或常量值。
sizeof有三种语法形式,如下:
    1) sizeof( object ); // sizeof( 对象 );
    2) sizeof( type_name ); // sizeof( 类型 );
    3) sizeof object; // sizeof 对象;
    今天主要讨论指针和数组的使用 具体其他的 可以自己查阅MSDN
指针变量的sizeof 
  指针记录了另一个对象的地址。既然是来存放地址的,等于计算机内部地址总线的宽度。
  所以在32位 计算机中,一个指针变量的返回值必定是4(注意结果是以字节为单位),可以预计,在将来的64位系统中指针变量的sizeof结果为8。
数组的sizeof
数组的sizeof值等于数组所占用的内存字节数,也就是数组的长度
现在看段代码就清楚了
char str[] = “XXOO”;
char *p = str ;
int l = sizeof (str );
l = sizeof ( p );
可以分析
int l = sizeof (str );// sizeof 数组名时是计算数组的长度
l = sizeof ( p );     // p是个指针,指针在32位机子上长度是4字节的
在这里就可以发现,其实求得是数组长度 不是数组元素个数
但是如果我们需要求数组的个数如何求?其实还是蛮简单 MSDN有模型:
int XX = sizeof( OO ) / sizeof( char ); // 总长度/单个元素的长度
sizeof()是C++语言自已的运算子。一般而言,关于运算子的行为属于语言本身自已的规定,不存在为什么的问题。也就说C++为sizeof运算子规定的行为就是要对数组名返回其数组所占内存的byte计数,而对其它变量返回应有的类型byte长度,
比如:
把”char str[];”改为”long str[4];”则”sizeof(str);”将返回值为16(16个byte)。而对其指向数组str[4]指针,在32位平台上内存地址的byte长度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。

转自http://www.cnblogs.com/xiangshancuizhu/archive/2011/03/16/1985570.html

0 0
原创粉丝点击