二维数组的数组名和地址问题

a[4][2]是一个二维数组,printf("%10d\n",&a+1);printf("%10d\n",a+1);这两个不同,为什么?... a[4][2]是一个二维数组,
printf("%10d\n",&a+1);
printf("%10d\n",a+1);这两个不同,为什么?
展开
 我来答
金色潜鸟
2014-08-16 · TA获得超过3.2万个赞
知道大有可为答主
回答量:1.3万
采纳率:89%
帮助的人:5605万
展开全部
a 是 这个二维数组 的首地址。
&a 也是 这个二维数组 的首地址。
单独 输出 a, 和 &a 是 一样的 地址值。
a+1, 是 a数组第2行的首地址,即 &a[1][0]。 等于 二维数组 的首地址 + 一行占用的内存字节数。
&a + 1, 不是简单的 首地址 加 1,而是 首地址 + 整个数组占用的内存字节数。
----
也就是说 此1 非那1:
a+1, 是 加一行大小
&a + 1, 是 加整个数组大小
用式子计算时要注意 &a[0][0] 或 &a 是地址,不能直接 + sizeof(a), 因为 sizeof(a) 是 int 型。输出格式 %10d, 则 相加时 要用 (int)(&a[0][0]) + sizeof(a) ,
若用: (&a[0][0]) + sizeof(a) 结果不对 -- c 语言 “奇葩” 之一。
百度网友9af53fb
2014-08-16 · TA获得超过998个赞
知道小有建树答主
回答量:261
采纳率:100%
帮助的人:88.4万
展开全部
首先,必须明确的是,a[4][2]是一个二维数组的时候,,你输出a的时候是一个地址;

其次,你对a进行取地址&,那么其结果还是一个地址,这个地址是a存放的地址,不是a的输出地址。
说起来有些复杂,如果你已经了解了指针,以下代码,可以帮助你理解这个关系:
#include <stdio.h>
void main()

{
int a[4][2]={0};
int *p1;
int **p2;
p1=a[0];
p2=&p1;
printf("%10d%10d\n",&a[0][0],a[0][0]);
printf("%10d%10d%10d%10d%10d%10d\n",a,a+1,a+2,a+4,a+5,&a+1);
printf("%10d%10d\n",p1,*p1);
printf("%10d%10d%10d\n",p2,p2+1,*p2);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式