二维数组名与二级指针有什么区别?

#include<stdio.h>intmain(void){inta[2][3]={1,2,3,4,5,6};int**p=a;printf("%d\n",p[0]);... # include <stdio.h>
int main(void)
{
int a[2][3] = {1, 2, 3, 4, 5, 6};
int ** p = a;

printf(" %d\n", p[0]); // 输出 1
printf("%d\n", a[0]); // 以整数形式输出二维数组的地址 1638192

return 0;
}
为什么p[0]输出数组第一个元素的址,而a[0]输出了数组的首地址?
展开
 我来答
sunchy12345678
推荐于2016-01-20 · TA获得超过665个赞
知道小有建树答主
回答量:443
采纳率:100%
帮助的人:345万
展开全部
实际上它们是没有任何关系的,那个赋值也不应该通过。以下的解答建立在一定程度的脑补上,实际上这段代码问题相当多。
a的内存布局如下:
-------------------------
| 1 | 2 | 3 | 4 | 5 | 6 |
-------------------------
p[0]结果是一个int*,它的大小凑巧和int相同。p[0]凑巧读到了a[0][0],所以输出1。
a[0]结果是一个int*,但是它是由int[3]退化而来,编译器实际上输出的是&a[0][0]。
换句话说,p假装指向的是一个数组而把那一段内存解释成指针(就像一个int数组一样)。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2018-04-23
展开全部

网页链接 这个帖子很详细

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式