C:Int a[3][4];a+i代表a[i][0]的地址,那为什么*(a+i)还是代表地址?

*不是间接访问操作吗,就是根据a+i的值提供的地址,去访问对应的地址内存,所以为什么*(a+i)还是代表地址?#include<stdio.h>intmain(){cha... *不是间接访问操作吗,就是根据a+i的值提供的地址,去访问对应的地址内存,所以为什么*(a+i)还是代表地址?
# include<stdio.h>

int main()
{
char a[2][3]={"abc","cd"};

printf("%d\n%d\n%c",a,&**a,*a);

return 0;
}
为什么执行结果却是
37814040

37814040

前面两输出是一样的,也就是说它们都代表同一个地址,及a[0][0],可是为什么*a却不是a[0][0]?
好吧,懂了,就是a和*a都是代表a[0][0]的地址,只不过他们的代表的类型不一样,a的类型为char[3],a+1,a的地址加上3*char个字节?那*a有分配内存空间吗?
展开
 我来答
帐号已注销
2020-03-01 · TA获得超过317个赞
知道小有建树答主
回答量:345
采纳率:90%
帮助的人:86.7万
展开全部
int a[3][4]; a+i不代表a[i][0]的地址,而是代表a[i]的地址,因为a+i的类型为 int (*)[4]
而*(a+i)的类型 int [4],也就是一个包含4个元素的一维数组,所以它仍是一个地址。
*(a+i)相当于*(a+i)+0, 即数组a第i行的首地址(数组a第i行是一个一维数组,亦即数组a第i行第一个元素的地址,那么*(*(a+i)+0) = a[i][0]
追问
T~T,二维数组的内容不是先按列连续排布的吗?
所以a[0]的地址在数值上不就是a[0][0]的地址吗?还是说它们的大小还是有区别的?那到底有什么区别?
追答
这是二维数组,需要两次解引用。
a[0]相当于*(a+0),它存放的是a[0][0]的地址,也是数组a第1行的首地址。
a[0][0]相当于*(*(a+0)+0)
a[0]的地址是a,也就是数组a的首地址,也可写成&a[0],它不是a[0][0]的地址,a[0][0]的地址是&a[0][0],而这个地址也等于a[0],也即上述数组a的第1行的首地址。
数组的[]操作符与解引用操作符*等价,它们是取地址&的逆运算。比如,*(&a[0][0])就是a[0][0]。
哈哈哈dxwM
2020-03-01 · TA获得超过114个赞
知道小有建树答主
回答量:375
采纳率:72%
帮助的人:78.3万
展开全部
同样的疑问,谁说是地址的?
1 2 3 4
5 6 7 8
9 0 8 4
a代表第一行第一列
a[0]代表第一行
a+i代表第i行,就是a[i]的首列地址
*(a+i)就是取的a[i][0]的值。
追答
同样的疑问,谁说是地址的?
1 2 3 4
5 6 7 8
9 0 8 4
a代表第一行第一列
a[0]代表第一行
a+i代表第i行,就是a[i]的首列地址
*(a+i)就是取的a[i][0]的值。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
mimiba212
2020-03-01 · TA获得超过413个赞
知道小有建树答主
回答量:1504
采纳率:64%
帮助的人:82.9万
展开全部
不是啊,加上*表示取值
追问
*a代表取a的首地址值,可是a就是地址常量?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式