为什么C语言二维数组a[2][2], a和*a输出是相同的,都表示一个地址

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

printf("%p\n",a);
printf("%p\n",*a);

return 0;
}

如书上说的a如果是一维数组首元素地址的话。*a应该是首元素本身吧,也就是数组{1,2},不过printf函数好像是不能输出整个数组的,想请问各位printf是怎么处理*a的输出的,从而使得输出的是和a一样的地址。
展开
 我来答
自我编程
2019-07-15 · 科技优质答主
自我编程
采纳数:1481 获赞数:4283

向TA提问 私信TA
展开全部
二维数组可以理解为几个指向一维数组的指针组成指针数组
所以从类型上讲,a是指向指针的指针,*a是指向一行一维数组的指针。
但a作为数组名,又表示了数组首地址(在内存中元素地址是连续的)。
*a是第一行数组首地址。所以值相同
(注意只是值相同,比如a[n]和(*a)[n]意义就不一样,一个表示第n行的行指针,一个是第一行的第n列)。
天神在此1
2019-07-15 · TA获得超过1.1万个赞
知道大有可为答主
回答量:4902
采纳率:47%
帮助的人:1652万
展开全部
a指的是这个二维数组第一维数组的首地址,即&a[0] (a+1就是&a[1])
*a指的是这个二维数组的首地址,即&a[0][0] (*a+1就是&a[0][1])
**a指的是这个二维数组第一维数组的首地址指向的值,也就是a[0][0]的值,不是指针
a与*a的值是一样的,因为&a[0]与&a[0][0]是一样的
以下是地址对应关系
a等于&a[0]等于&a[0][0]
a+1等于&a[1]等于&a[1][0]
*a等于&a[0][0]
(*a+1)等于&a[0][1]
*(a+1)等于&a[1][0]
[*(a+1)+1]等于&a[1][1]
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式