问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

谁能给我讲讲二维数组元素的引用啊?都有那几种方式啊?10

发布网友 发布时间:2023-10-13 19:51

我来回答

5个回答

热心网友 时间:2024-11-14 17:19

你好!!!
举例:首先我们要知道数组的是按线性的顺序存放在一起的,比如a[0][2]和a[1][0]是连在一起的,后面的依次类推、、、
int a[2][3]{1,2,3,4,5,6};
int *p=*a;表示把数组的的第一行第一个元素的地址给指针变量,但是*p=a是错误的!!!

输入数组的元素可以使用数组本身:a[i][j],代表第i行,第j列的元素的值;
其实系统认为二维数组名就是二维指针,我们可以把数组名当做指针使用:
*(*(a+i)+j)表示代表第i行,第j列的元素的值。

要是使用刚才的指针*(p+n),注意此时的n是从0---5,可以输出数组中的任何一个元素,你也许会问:数组时二维的,而指针变量p是一维的,为什么可以输出所有元素呢???刚才不是说了吗??:首先我们要知道数组的是按线性的顺序存放在一起的,比如a[0][2]和a[1][0]是连在一起的,后面的依次类推、、、

一般情况下:都是使用a[i][j],和*(*(a+i)+j)的形式、、、当然还有很多方法,要是都列出来,恐怕要几张纸呢??
你只要把书本好好看看,多想想,自己就有一些认识了。
要是有什么不理解的问题,我们可以交流一下!!

热心网友 时间:2024-11-14 17:19

从根本来说我知道是二种, 因为按下标访问和按指针的访问其实是一样的意义.
楼下说的 a[i][j],和*(*(a+i)+j)方式其实原理是一样的.
一\ 这种是先确认行, 寻址数组元素,是先把二维数组的每一行看成一个一维数组的元素,
然后再去分,每一行统领的那一列又作为一个一维数组.有二个步骤.
就好比给你一个门牌号, 303, 你知道门牌号的意义, 你会直接跑到三楼(按行再去找列)去找第三个房间.
二\还有一种是直接通过列去寻址,只分一次, 直接把二维数组的所有元素看成一个一维数组的元素. 通过偏移量计算每个元素的值. 这时候输出的方式就是p[i * n + j] 的方式了,(n的值是数组的列数) 而不是像第一种是 p[i][j]的方式.
这种方式是给你一个门牌号, 303, 你不知道门牌号的意义, 你会先从一楼开始一间一间的找, 然后二楼,三楼,这时候你发现找到了.
没有时间答的很好,仔细, 如果你初学没多久,看不太懂的话, 还是得自己去查资料学, 或者找好的课件,找老师去问. 这样才能足够确信, 加理解.
我这里能提供的就是,在你学习到理解一定程度后,你还知道还有另外个方向,这时候你可以再去往这个方向,靠自己探索,搞详细,搞明白

热心网友 时间:2024-11-14 17:20

你好!!!
举例:首先我们要知道数组的是按线性的顺序存放在一起的,比如a[0][2]和a[1][0]是连在一起的,后面的依次类推、、、
int a[2][3]{1,2,3,4,5,6};
int *p=*a;表示把数组的的第一行第一个元素的地址给指针变量,但是*p=a是错误的!!!

输入数组的元素可以使用数组本身:a[i][j],代表第i行,第j列的元素的值;
其实系统认为二维数组名就是二维指针,我们可以把数组名当做指针使用:
*(*(a+i)+j)表示代表第i行,第j列的元素的值。

要是使用刚才的指针*(p+n),注意此时的n是从0---5,可以输出数组中的任何一个元素,你也许会问:数组时二维的,而指针变量p是一维的,为什么可以输出所有元素呢???刚才不是说了吗??:首先我们要知道数组的是按线性的顺序存放在一起的,比如a[0][2]和a[1][0]是连在一起的,后面的依次类推、、、

一般情况下:都是使用a[i][j],和*(*(a+i)+j)的形式、、、当然还有很多方法,要是都列出来,恐怕要几张纸呢??
你只要把书本好好看看,多想想,自己就有一些认识了。
要是有什么不理解的问题,我们可以交流一下!!

热心网友 时间:2024-11-14 17:20

对于a[i][j](二维数组的大小为n×m)而言,
首先要搞清楚行指针和列指针
行指针:&a[i]或者a+i指向行,&a[i]=&*(a+i)=a+i
列指针:a[i]或*(a+i)指向列,a[i]等价于*(a+i)
元素的引用方式有如下三种方式
1.通过地址引用二维元素
*(&a[i][j]),
*(a[i]+j),
*(*(a+i)+j),
*(a[0]+m*i+j)
*(&a[0][0]+m*i+j)
(*(a+i))[j]
2.建立一个指针数组引用二维元素
int *p[3],a[3][2],i,j;
for(i=0;i<3;i++)
p[i]=a[i];//p[i]用来存放地址,a[i]为列地址
等价如下
(1) *(p[i]+j) 与*(a[i]+j)对应
(2)*(*(p+i)+j) 与*(*(a+i)+j)对应
(3)(*(p+i))[j] *(p[i]+j) 与*(a[i]+j)对应
(4)p[i][j] 与a[i][j]对应
3.建立一个行指针引用二维数组元素
int a[3][2],(*p)[2];
p=a;
(1) *(p[i]+j) 与*(a[i]+j)对应
(2)*(*(p+i)+j) 与*(*(a+i)+j)对应
(3)(*(p+i))[j] 与(*(a+i))[j]对应
(4)p[i][j] 与a[i][j]对应
例题如下
1.
#include<stdio.h>
main()
{
int score[][4]={{60,70,80,90},{56,89,67,88},{34,78,90,66}};
int i,j;
printf("输入学生号:0-2");
scanf("%d",&i);
printf("the score of No.%d are:\n",i);
for(j=0;j<4;j++)
printf("%d\t",*(*(score+i)+j));//score+i为列指针,*(score+i)为行指针
printf("\n");
}
2.
#include<stdio.h>
main()
{
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int *p;
for(p=a[0];p<a[0]+12;p++)//使p依次指向下一个元素,a[i]和*(a+i)是指向列的指针;&a[i]或a+i是指向行的指针
{
if((p-a[0])%4==0)printf("\n");
printf("%4d",*p);//输出p指向的数组元素的值
}
printf("\n");
}
3
#include<stdio.h>
main()
{
int score[][4]={{60,70,80,90},{56,89,67,88},{34,78,90,66}};
int i,j;
printf("输入学生号:0-2");
scanf("%d",&i);
printf("the score of No.%d are:\n",i);
for(j=0;j<4;j++)
printf("%d\t",*(score[i]+j));
printf("\n");
}
4
#include<stdio.h>
main()
{
int score[][4]={{60,70,80,90},{56,89,67,88},{34,78,90,66}};
int i,j,*p;
printf("输入学生号:");
scanf("%d",&i);
printf("the score of No.%d are:\n",i);
for(p=score[i];p<score[i]+4;p++)
printf("%d\t",*p);//p+i指向第i行,*(p+i)指向第i行0列元素*(p+i)+j指向第i行j列元素,是列地址
printf("\n");
}
5.
#include<stdio.h>
main()
{
int score[][4]={{60,70,80,90},{56,89,67,88},{34,78,90,66}};
int i,j,*p;
printf("输入学生号:");
scanf("%d",&i);
printf("the score of No.%d are:\n",i);
for(p=score[i],j=0;j<4;j++)
printf("%d\t",*(p+j));
printf("\n");
}
6
#include<stdio.h>
main()
{
int score[][4]={{60,70,80,90},{56,89,67,88},{34,78,90,66}};
int i,j,(*p)[4];//指针变量p指向包括4个整型元素的一维数组;
p=score;//p指向二维数组0行元素,p+1所指向的元素是p所指向元素的下一行元素;
printf("输入学生号:0-2");
scanf("%d",&i);
printf("the score of No.%d are:\n",i);
for(j=0;j<4;j++)
printf("%d\t",*(*(p+i)+j));//p+i指向第i行,p是行指针,*(p+i)指向第i行0列元素,是列指针。*(p+i)+j指向第i行j列元素,是一个元素的地址
printf("\n");
}

热心网友 时间:2024-11-14 17:21

这个关系到很多,引用有指针引用,这一个比较难一点,还有函数引用,中等难度,再有就是直接引用,用的少
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? 华为p8max二手多少钱2 台湾影星钟汉良现在的女友是谁及个人资料118 青秀山风景优美尤其是什么 在电磁打点计时器中3个点为一个记数点时间间隔为几秒,有几个间隔呢... 安庆有到南昌机场的大巴吗? 螺纹标注方法中的P5是什么? tr48×10(p5)—7h 是双头螺纹么?3 谁能找到这四张图的原图???谢谢啊!!! 上海造币厂2003年贺卡 上海造币厂贺卡 go to sleep Eminem 中文歌词4 monster 的中英文对照歌词。132 Go to sleep EMINEM 中文歌词26 英语四级考试考试结束没有立即停笔 ,还涂了一题,老师没看到,... 急急!!四级作文答题卡材料旁写有铅笔汉字忘记擦,会判作弊吗? 2岁孩子的叛逆期究竟有多难?到底该如何度过呢? 父母房产过户给已婚子女算夫妻共同财产吗? 壳牌机油和嘉实多机油哪个更好?614 十大润滑油品牌里嘉实多和壳牌哪个更好一些?103 壳牌和嘉实多哪个好大家一般推荐买什么系列? 人防地下室基础梁除了用砖胎膜之外,是不是可以用高强水泥平板代...1 C++,有关二维数组和引用之类的问题,求解惑?1 java高手:java定义二维数组问题251 为什么excel表格下拉后数字不依次增大,而是一样的数字?275 恋爱中怎么理财??3 一路风雨一路情小说txt全集免费下载 如果在大神借号网购买的账号出现了问题平台负责吗?12 今天星期六我给qq钱包提现到建行卡上了,多久能到12 我的显卡上有HDMI接口和DVI接口 但是显示器上只有HDMI接口和VGA接口... 在机械加工图纸中:Tr30×10(P5)-7e是什么意思34 怎么去除鞋子上的油污?104 鞋子上沾了油怎么清洗?142 我想重新注册个新的,该怎么注册,我就一个手机号码6 为什么联想原装鼠标质量越来越差 我已经有一个了,现在想重新弄一个新的,(就像一个...417 筏板基础是不是都要用到砖胎膜的?16 新上了个手机号码,可能以前被别人注册过,我现在想自己重...642 桩筏基础中板和梁必须用砖胎膜吗?如果用木模,模板需不需要拆除...7 壳牌、美孚和嘉实多,三大机油品牌哪个更好?64 两个码切换步数相同 机械领袖单色彩虹跑马怎么设置键盘灯?