您的位置:首页 > 编程语言 > C语言/C++

C++中sizeof详解

2016-03-22 15:13 239 查看
void main()

{

int a[2][2]={1,2,3,4};//这是一个2*2的二维数组

int (*p)[2];//数组指针

p=a;//令p指向数组a

printf("%d\n%d\n",sizeof a,sizeof p);

}

猜一猜输出是什么?






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



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

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

[cpp] view
plain copy

<strong>#include<stdio.h>

void main()

{

int a[2][2]={1,2,3,4};//这是一个2*2的二维数组

int (*p)[2];//数组指针

p=a;//令p指向数组a

printf("%d\n%d\n",sizeof(a+1),sizeof(p+1));

printf("%d\n%d\n",sizeof(a+0),sizeof(p+0));

}

运行结果:





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

现在再来看一段代码:

[cpp] view
plain copy

#include<stdio.h>

void f(int a[][2])

{

printf("%d\n",sizeof a);

}

void main()

{

int a[2][2]={1,2,3,4};//这是一个2*2的二维数组

printf("%d\n",sizeof a);

f(a);

}

再猜一下输出是什么?





是不是又有点困惑呢?

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

总结:数组名的类型是指向元素类型的指针,值是指针常量。(a+1)的类型是一个指针变量。把数组名作为参数传递的时候实际上传递的是一个指针变量。sizeof对变量和数组名操作时返回的结果会不一样。数组指针是指向数组的指针,其值可以是变量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: