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对变量和数组名操作时返回的结果会不一样。数组指针是指向数组的指针,其值可以是变量。
{
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对变量和数组名操作时返回的结果会不一样。数组指针是指向数组的指针,其值可以是变量。
相关文章推荐
- [Leetcode]Binary Tree Vertical Order Traversal
- 采用C++的ACE库实现的一个通用的C/S架构通信程序
- 2016蓝桥杯C/C++省赛B组第6题 方格填数 DFS
- 【小镇的技术天梯】C语言,冒泡、快速、希尔、选择排序
- C++面向对象编程分享04----20160322_李楚煌
- C++死锁解决心得
- C++模板的特化详解(函数模版特殊,类模版特化)
- C++ strIcmp 字符串大小比较
- 2016蓝桥杯省赛C/C++B组7题剪邮票 DFS枚举组合情况BFS判联通
- C语言实现二叉查找树
- C语言函数sscanf()的用法
- C++实现两个大整数的相加(考虑到负数异常情况)
- C语言宏高级用法 [总结]
- 【c/c++】一直想写那个盗取别人手机号码的CODE
- JNI_最简单的Java调用C/C++代码
- C++函数前和函数后加const修饰符区别
- C++处理类型
- C/C++—— 输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离
- 使用适配器模式模拟篮球队翻译 C++
- 继承