C# sizeof分析与实例

作者:袖梨 2022-06-25

sizeof操作的是一个结构体或者变量时,返回值为它的实际大小,这个实际大小可能包括为了字节对齐插入的多余字节。
第二句:如果操作的是一个静态大小的数组,返回整个数组的大小
第三句:sizeof操作符不能返回动态开辟的数组或形参数组的大小。
如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小,所以是4

int getsize(char p[100]="hello")
{
 return sizeof(p);
}
int main(int argc, char* argv[])
{
 char a[200]="hello!";
 cout<  return 0;
}
第一个返回200,第二个却返回4,sizeof(a)返回数组的大小,而第二个实际上是指针变量的大小,怎么回事呢?
在网上看到强人分析的msdn才知道原因:


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<       cout<       cout<       cout<       cout< 问题解析: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。

相关文章

精彩推荐