C++中sizeof详解

  1. void main()  
  2. {  
  3.     int a[2][2]={1,2,3,4};//这是一个2*2的二维数组  
  4.     int (*p)[2];//数组指针  
  5.     p=a;//令p指向数组a  
  6.     printf("%d\n%d\n",sizeof a,sizeof p);  
  7. }

猜一猜输出是什么?


困惑了吗?为什么结果会是这样的呢,让我们先初步了解一下sizeof关键字吧,下面是MSDN上sizeof的说明:

 


当sizeof用于变量时返回这个变量占用的实际空间的大小。当sizeof用于数组名时,返回整个数组的大小(这里的大小指占用的字节数)。p是一个指针变量,这个变量占用四个字节。而a是数组名,所以sizeof a返回数组a中的全部元素占用的字节数。

了解了sizeof,猜猜下面这段代码输出什么

[cpp]  view plain  copy
  1. <strong>#include<stdio.h>  
  2.   
  3. void main()  
  4. {  
  5.     int a[2][2]={1,2,3,4};//这是一个2*2的二维数组  
  6.     int (*p)[2];//数组指针  
  7.     p=a;//令p指向数组a  
  8.     printf("%d\n%d\n",sizeof(a+1),sizeof(p+1));  
  9.     printf("%d\n%d\n",sizeof(a+0),sizeof(p+0));  
  10. }  


运行结果:

从结果中看出,a在做+运算时是转化成了指针变量,此时a+i的类型是一个指针变量,而不是一个数组名。但a[i]是一个一维数组的数组名,sizeof(a[0])的值是8

现在再来看一段代码:

[cpp]  view plain  copy
  1. #include<stdio.h>  
  2.   
  3. void f(int a[][2])  
  4. {  
  5.     printf("%d\n",sizeof a);  
  6. }  
  7. void main()  
  8. {  
  9.     int a[2][2]={1,2,3,4};//这是一个2*2的二维数组  
  10.     printf("%d\n",sizeof a);  
  11.     f(a);  

再猜一下输出是什么?

是不是又有点困惑呢?

解释:这是因为传参的时候数组名转化成指针变量,注意到函数f中f(int a[][2])这里并不需要指定二维数组的长度,此处可以改为int (*a)[2]。所以传过来的就是一个数组指针变量。这样明白了吧!

 

总结:数组名的类型是指向元素类型的指针,值是指针常量。(a+1)的类型是一个指针变量。把数组名作为参数传递的时候实际上传递的是一个指针变量。sizeof对变量和数组名操作时返回的结果会不一样。数组指针是指向数组的指针,其值可以是变量。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值