二维数组的数组名和地址问题
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);这两个不同,为什么? 展开
printf("%10d\n",&a+1);
printf("%10d\n",a+1);这两个不同,为什么? 展开
展开全部
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 语言 “奇葩” 之一。
&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 语言 “奇葩” 之一。
展开全部
首先,必须明确的是,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);
}
其次,你对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);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |