求c语言指针方式引用二维数组问题

如图所示先说明,这个方法我们没学过,从开始就不知道原理了为什么a和*a都是地址啊,能详细说明原理吗,说一四五就可以,谢谢... 如图所示
先说明,这个方法我们没学过,从开始就不知道原理了
为什么a和*a都是地址啊,能详细说明原理吗,说一四五就可以,谢谢
展开
 我来答
岔路程序缘

2020-07-26 · TA获得超过8.9万个赞
知道大有可为答主
回答量:9918
采纳率:93%
帮助的人:3407万
展开全部
就按照你举的例子来说:
a[2][3]={0,1,2,3,4,5}
这时形成一个二维数组,元素是:
a[0][0]=0,物理地址&a[0][0]
a[0][1]=1,地址&a[0][0]+1
a[0][2]=2,地址&a[0][0]+2
a[1][0]=3,地址&a[0][0]+3
a[1][1]=4,地址&a[0][0]+4
a[1][2]=5,地址&a[0][0]+5
分配存储空间时,系统把每3个数据作为一组,组名记a[0]、a[1],这两个值分别是每组第一个元素的地址,即a[0]=&a[0][0],a[1]=&a[1][0]。
所以:
a指向数组首元素的地址,a=&a[0][0];
a[0]代表第一组首元素地址,当然,a[0]也指向数组首元素的地址,a[0]=&a[0][0];
*a是对a取值,它取出的是a[0],当然=&a[0][0];
&a[0]指a[0]的地址,还是它自己,所以&a[0]=&a[0][0]。
所以,第一行个打印语句输出的5个内容都是一样的,所以,输出5个19ff0c。是a[0][0](元素0)的储存位置。
第二个打印语句输出的5个内容也是相同的,都是19ff18。它们是a[1][0](元素3)的存放位置,19ff0C+3×4=19ff0c+12=19ff0c+c=19ff18。
后面也是类似解释。
具体p1、p2、p3的使用,是前面定义了三个字符串,此处拿来使用。你可以直接把p1的内容"%x,%x,%x,%x,%x\n"拿来替换掉p1,就好理解了。
有什么问题请留言。
更多追问追答
追问
这个程序将指针p1放入输出里,是指针p1依次指向a,*a,a[0]还是有别的意思
*a是对a的取值,但a指向的数组首元素地址,那*a不应该取出地址的值0吗
火火火火火龙
2020-07-26 · 先建模一条龙,然后让其喷火,最后取名火龙
火火火火火龙
采纳数:43 获赞数:85

向TA提问 私信TA
展开全部

我是这样理解的:

a是一个二维数组,也就是一个二级指针,那么a代表指向数组头的二级指针,*a代表指向数组头的一级指针,**a代表第一个数组元素。因为二维数组只是一维数组在内存地址上的连续表示,所以a和*a的区别在于它们的有效范围不同,分别是数组的两个维度的维数。

所以a和*a都是指向数组头的指针,它们都指向第一个元素,所以输出的地址相同。

证实:

#include <stdio.h>


int main()

{

    int a[2][2] = {1,2,3,4};

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


    return 0;

}

输出结果:

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
gu...2@163.com
2020-07-26
知道答主
回答量:38
采纳率:0%
帮助的人:2.1万
展开全部
这个方法我们没学过,从开始就不知道原理了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式