用二维指针给一为数组排序

二维指针数组怎么写

1.c语言中二维数组的指针如何表示

二维数组和指针 ⑴ 用指针表示二维数组元素。

要用指针处理二维数组,首先要解决从存储的角度对二维数组的认识问题。一个二维数组在计算机中存储时,是按行存储的,即先存储第一行的元素,再存储第二行的元素。

当把每一行看作一个整体,即作为一个大的数组元素时,原来的二维数组也就变成一个一维数组了。而每个大数组元素对应原来二维数组中的一行,称为行数组元素,显然每个行数组元素都是一个一维数组。

下面讨论二维数组元素和指针之间的对应关系,清楚了二者之间的关系,就能用指针处理二维数组了。设p是指向二维数组a[M][N]的指针变量,若有:p=a[0]; 则p+j将指向a[0]数组中的元素a[0][j]。

由于a[0]、a[1]┅a[M-1]等各个行数组依次连续存储,则对于a数组中的任一元素a[i][j],指针的一般形式如下:p+i*N+j用"*"运算符表示为:*( p+i*N+j)同样,a[i][j]也可使用指针下标法表示,如下:p[i*N+j] 例如,有如下定义:int a[3][4]={{10,20,30,40,},{50,60,70,80},{90,91,92,93}}; 则数组a有3个元素,分别为a[0]、a[1]、a[2]。而每个元素都是一个一维数组,各包含4个元素,如a[1]的4个元素是a[1][0]、a[1][1]、a[1]2]、a[1][3]。

若有:int *p=a[0]; 则数组a的元素a[1][2]对应的指针为:p+1*4+2 元素a[1][2]也就可以表示为:*( p+1*4+2) 用下标表示法,a[1][2]表示为:p[1*4+2] 特别说明:对上述二维数组a,虽然a[0]、a都是数组首地址,但二者指向的对象不同。a[0]是一维数组的名字,它指向的是一维数组a[0]的首元素a[0][0],对其进行“*”运算,得到的是一维数组元素a[0][0]的值,即*a[0]与a[0][0]是同一个值。

而a是一个二维数组的名字,它指向的是二维数组a的首元素a[0],对a进行“*”运算,得到的是一维数组a[0]的首地址,即*a与a[0]是同一个值。它的指针移动单位是“行”,所以a+i指向的是第i个行数组,即指向a[i]。

当用int *p;定义指针p时,p的指向是一个int型数据,而不是一个地址,因此,用a[0]对p赋值是正确的,而用a对p赋值是错误的。这一点请务必注意。

示例:#include int main() { int a[3][4]={{3,17,8,11},{66,7,8,19},{12,88,7,16}}; int *p=a[0],max,i,j,row,col; max=a[0][0]; row=col=0; for(i=0;i<3;i++) for(j=0;j<4;j++) if(*(p+i*4+j)>max) { max=*(p+i*4+j); row=i; col=j; } printf("a[%d][%d]=%d\n",row,col,max); printf("address of a is:%x\n", (unsigned int)a); printf("address of a[0] is:%x\n", (unsigned int)a[0]); printf("address of a[0][0] is:%x\n\n", (unsigned int)&a[0][0]); printf("address of (a+1) is:%x\n", (unsigned int)(a+1)); printf("address of (a[0]+1) is:%x\n", (unsigned int)(a[0]+1)); printf("address of (a[0][0]+1) is:%x\n", (unsigned int)(&a[0][0]+1)); return 0; } 运行结果:a[2][1]=88 address of a is:bfdc0368 address of a[0] is:bfdc0368 address of a[0][0] is:bfdc0368 address of (a+1) is:bfdc0378 address of (a[0]+1) is:bfdc036c address of (a[0][0]+1) is:bfdc036c 从结果看出,a,a[0],a[0][0]是同一个地址,⑵ 用二维数组名作地址表示数组元素。另外,由上述说明,还可以得到二维数组元素的一种表示方法:对于二维数组a,其a[0]数组由a指向,a[1]数组则由a+1指向,a[2]数组由a+2指向,以此类推。

因此,*a与a[0]等价、*(a+1)与a[1]等价、*(a+2)与a[2]等价,┅,即对于a[i]数组,由*(a+i)指向。由此,对于数组元素a[i][j],用数组名a的表示形式为:*(*(a+i)+j)指向该元素的指针为:*(a+i)+j数组名虽然是数组的地址,但它和指向数组的指针变量不完全相同。

指针变量的值可以改变,即它可以随时指向不同的数组或同类型变量,而数组名自它定义时起就确定下来,不能通过赋值的方式使该数组名指向另外一个数组。示例:求二维数组元素的最大值。

该问题只需对数组元素遍历,即可求解。因此,可以通过顺序移动数组指针的方法实现。

main() { int a[3][4]={{3,17,8,11},{66,7,8,19},{12,88,7,16}}; int *p,max; for(p=a[0],max=*p;pmax) max=*p; printf("MAX=%d/n",max); } 执行结果:MAX=88 这个程序的主要算法都是在for语句中实现的:p是一个int型指针变量;p=a[0]是置数组的首元素地址为指针初值;max=*p将数组的首元素值a[0][0]作为最大值初值;p指针的变化范围限制在12个元素的位置内;p++使得每比较一个元素后,指针后移一个元素位置。示例:求二维数组元素的最大值,并确定最大值元素所在的行和列。

本例较之上例有更进一步的要求,需要在比较的过程中,把较大值元素的位置记录下来,显然仅用上述指针移动方法是不行的,需要使用能提供行列数据的指针表示方法。main() { int a[3][4]={{3,17,8,11},{66,7,8,19},{12,88,7,16}}; int *p=a[0],max,i,j,row,col; max=a[0][0]; row=col=0; for(i=0;i<3;i++) for(j=0;j<4;j++) if(*(p+i*4+j)>max) { max=*(p+i*4+j); row=i; col=j; } printf("a[%d][%d]=%d/n",row,col,max); } 程序运行结果:a[2][1]=88 ⑶ 行数组指针 对于指针,不管有多复杂,按照以下原则进行分析:从变量名处起,根据运算符优先级结合,一步一步分析。

在上面的说明中已经知道,二维数组名是指向行的,它不能对如下说明的指针变。

2.二维指针数组

a[i]从形式上看是a数组中的第i个元素。如果a是一维数组名,则a[i]代表a数组第i个元素所占的内存单元的内容。a[i]是有物理地址的,是占内存单元的。但如果a是二维数组,则a[i]是代表一维数组名。它只是一个地址(如同一维数组名只是一个指针常量一样。) a,a+i,a[i],*(a+i),*(a+i)+j,a[i]+j都是地址。 *(a[i]+j)和*(*(a+i)+j)是二维数组元素a[i][j]的值。

举例说明一下:

int a[3][4]={…………};

a,*a; 第0行首地址和0行0列元素地址

a[0],*(a+0); 第0行0列元素地址

&a[0],&a[0][0];第0行元素首地址和0行0列元素地址

a[1],a+1; 第1行0列元素地址和1行首地址

&a[1][0],*(a+1)+0; 1列0行元素地址

a[2],*(a+2);2行0列元素地址

&a[2],a+2;第2行元素首地址

a[1][0],*(*(a+1)+0);第1行0列元素的值希望楼主采纳

3.怎么让一个二维指针指向一个二维数组

楼主,我想讲讲二级指针的原理,它是指向内存地址的地址,简单说就是取两次地址,一维数组,二维数组它们的元素都对应拥有一个暂时分配的内存地址,就是说只需要一个一级指针就可以完成取址,如果你用一个二级指针去取址是会取到乱值,如果是系统的地址系统就会崩溃(我就是试过用指针把编译器搞崩溃了),我下面例子说明一下:

一级指针取址:

char a[10];

char *p;

p=a/*将a[10]首地址赋值给一级指针*/

scanf("%s",p)/*编译系统会移动自动指针*/

char a[10][10];

char *p;

p=a[0]/*将a[10][10]首地址赋值给一级指针*/

scanf("%s",p)/*编译系统会移动自动指针*/

二级指针:

char *a[]={"12","34","56"};/*定义一个指针数组*/

char **p;/*二级指针*/

p=a;

printf("%s",*p);/*输出12*/

这里我解释一下,定义一个指针数组,就是数组里面又有地址,你仔细看看,数组有地址,指针数组里面的字符串如("12")也是有地址的,这样就需要用一个二级指针指向它了,就是二级寻址,这是*p就不再是元素,就变成字符串"12"的首地址,由于系统自动移动指针,所以就输出12

呵呵,如果你明白,那么三级指针也是同样道理,定义一个指向指针的指针数组,用一个

三级指针实现三级寻址,就是找三次地址,这里我就不举例了,怕你不明白了,呵呵……你现在明白了吗?

4.c语言中二维数组的指针如何表示

二维数组和指针⑴ 用指针表示二维数组元素。

要用指针处理二维数组,首先要解决从存储的角度对二维数组的认识问题。一个二维数组在计算机中存储时,是按行存储的,即先存储第一行的元素,再存储第二行的元素。

当把每一行看作一个整体,即作为一个大的数组元素时,原来的二维数组也就变成一个一维数组了。而每个大数组元素对应原来二维数组中的一行,称为行数组元素,显然每个行数组元素都是一个一维数组。

下面讨论二维数组元素和指针之间的对应关系,清楚了二者之间的关系,就能用指针处理二维数组了。设p是指向二维数组a[M][N]的指针变量,若有:p=a[0]; 则p+j将指向a[0]数组中的元素a[0][j]。

由于a[0]、a[1]┅a[M-1]等各个行数组依次连续存储,则对于a数组中的任一元素a[i][j],指针的一般形式如下:p+i*N+j用"*"运算符表示为:*( p+i*N+j)同样,a[i][j]也可使用指针下标法表示,如下:p[i*N+j]例如,有如下定义:int a[3][4]={{10,20,30,40,},{50,60,70,80},{90,91,92,93}};则数组a有3个元素,分别为a[0]、a[1]、a[2]。而每个元素都是一个一维数组,各包含4个元素,如a[1]的4个元素是a[1][0]、a[1][1]、a[1]2]、a[1][3]。

若有:int *p=a[0];则数组a的元素a[1][2]对应的指针为:p+1*4+2元素a[1][2]也就可以表示为:*( p+1*4+2)用下标表示法,a[1][2]表示为:p[1*4+2]特别说明:对上述二维数组a,虽然a[0]、a都是数组首地址,但二者指向的对象不同。a[0]是一维数组的名字,它指向的是一维数组a[0]的首元素a[0][0],对其进行“*”运算,得到的是一维数组元素a[0][0]的值,即*a[0]与a[0][0]是同一个值。

而a是一个二维数组的名字,它指向的是二维数组a的首元素a[0],对a进行“*”运算,得到的是一维数组a[0]的首地址,即*a与a[0]是同一个值。它的指针移动单位是“行”,所以a+i指向的是第i个行数组,即指向a[i]。

当用int *p;定义指针p时,p的指向是一个int型数据,而不是一个地址,因此,用a[0]对p赋值是正确的,而用a对p赋值是错误的。这一点请务必注意。

示例:#include int main(){ int a[3][4]={{3,17,8,11},{66,7,8,19},{12,88,7,16}}; int *p=a[0],max,i,j,row,col; max=a[0][0]; row=col=0;for(i=0;i<3;i++) for(j=0;j<4;j++) if(*(p+i*4+j)>max) { max=*(p+i*4+j); row=i; col=j; } printf("a[%d][%d]=%d\n",row,col,max); printf("address of a is:%x\n", (unsigned int)a); printf("address of a[0] is:%x\n", (unsigned int)a[0]); printf("address of a[0][0] is:%x\n\n", (unsigned int)&a[0][0]); printf("address of (a+1) is:%x\n", (unsigned int)(a+1)); printf("address of (a[0]+1) is:%x\n", (unsigned int)(a[0]+1)); printf("address of (a[0][0]+1) is:%x\n", (unsigned int)(&a[0][0]+1)); return 0;}运行结果:a[2][1]=88address of a is:bfdc0368address of a[0] is:bfdc0368address of a[0][0] is:bfdc0368address of (a+1) is:bfdc0378address of (a[0]+1) is:bfdc036caddress of (a[0][0]+1) is:bfdc036c从结果看出,a,a[0],a[0][0]是同一个地址,⑵ 用二维数组名作地址表示数组元素。另外,由上述说明,还可以得到二维数组元素的一种表示方法:对于二维数组a,其a[0]数组由a指向,a[1]数组则由a+1指向,a[2]数组由a+2指向,以此类推。

因此,*a与a[0]等价、*(a+1)与a[1]等价、*(a+2)与a[2]等价,┅,即对于a[i]数组,由*(a+i)指向。由此,对于数组元素a[i][j],用数组名a的表示形式为:*(*(a+i)+j)指向该元素的指针为:*(a+i)+j数组名虽然是数组的地址,但它和指向数组的指针变量不完全相同。

指针变量的值可以改变,即它可以随时指向不同的数组或同类型变量,而数组名自它定义时起就确定下来,不能通过赋值的方式使该数组名指向另外一个数组。示例:求二维数组元素的最大值。

该问题只需对数组元素遍历,即可求解。因此,可以通过顺序移动数组指针的方法实现。

main(){int a[3][4]={{3,17,8,11},{66,7,8,19},{12,88,7,16}};int *p,max;for(p=a[0],max=*p;pmax) max=*p;printf("MAX=%d/n",max);}执行结果:MAX=88这个程序的主要算法都是在for语句中实现的:p是一个int型指针变量;p=a[0]是置数组的首元素地址为指针初值;max=*p将数组的首元素值a[0][0]作为最大值初值;pmax) { max=*(p+i*4+j); row=i; col=j; }printf("a[%d][%d]=%d/n",row,col,max);}程序运行结果:a[2][1]=88⑶ 行数组指针对于指针,不管有多复杂,按照以下原则进行分析:从变量名处起,根据运算符优。

5.如何遍历二维指针数组

只要写个双重循环就可以实现,n维数据就可以用n重循环来实现。举一个2维的例子,可以借鉴一下,例如

int line =0;

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

for (int i = 0; i<2 ;++i)

{

for (int j = 0; j<2 ;++j)

{

cout << a[i][j] << ' ';

line++;

}

cout << endl;

}

二维指针数组怎么写

转载请注明出处育才学习网 » 用二维指针给一为数组排序

知识

罗梅芬用日文怎么写(罗钰潇日语怎么写)

阅读(21420)

本文主要为您介绍罗梅芬用日文怎么写,内容包括伊蕾娜日语怎么写,王雪菲用日文怎么说,张佳怡在日语中怎么写啊怎么读啊。罗 ら ラ ra钰 ぎょく ギョク gyoku潇 しょう シヨウ shou第一列:日语汉字,写法同汉字,都要用繁体,这三个都挺难写的,看

知识

邓先生的英文怎么写(1~40的英文怎么说)

阅读(10436)

本文主要为您介绍邓先生的英文怎么写,内容包括“邓先生”用英语怎么写,1~40的英文怎么说,漂亮英文beautiful缩写怎么写。1 one 2 two 3 three 4 four 5 five 6 six 7 seven 8 eight 8 nine 10 te

知识

一个人布满皱纹怎么写(描写人物皱纹的句子)

阅读(9508)

本文主要为您介绍一个人布满皱纹怎么写,内容包括描写人物皱纹的句子,描写人物皱纹的句子,皱纹怎么描写。、老人脸上布满了皱纹,那一条条曲折不均的像是墙上斑驳的印迹,爬满了面容,留下了岁月的痕迹。2、外祖父是一位年过六旬的白发老人。在他

知识

登录接口怎么写(php登录的接口怎么写)

阅读(7754)

本文主要为您介绍登录接口怎么写,内容包括php登录的接口怎么写,网页登陆接口怎么做,网站登录接口程序怎么做。PHP 接口 接口 使用接口(interface),你可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。我们可以通过int

知识

档案奖惩情况怎么写(奖惩情况怎么写)

阅读(9596)

本文主要为您介绍档案奖惩情况怎么写,内容包括奖惩情况怎么写,个人简历及奖惩情况怎么填写,个人简历里面奖惩情况怎么写。在简历里的“奖励”部分,列出与你所获得的并与你的求职目标相关的荣誉、奖励和奖金。你既可以按时间顺序排列,也可以按

知识

头孢克肟拼音怎么写(头孢克肟的肟念什么)

阅读(7998)

本文主要为您介绍头孢克肟拼音怎么写,内容包括头孢克肟片全名拼音,头孢克肟片全名拼音,头孢克肟的肟念什么。肟[wò] :是含有羰基的醛、酮类化合物与羟胺作用而生成的有机化合物,可以参与许多有机化学反应,例如经典的Beckmann重排就是肟为底

知识

一库搜用日语怎么写(日语一库是什么意思)

阅读(7982)

本文主要为您介绍一库搜用日语怎么写,内容包括日语大神来,看动漫里的主人公说一句:恰,一库搜这是什么意思,一库一库;一搜库这两个日语是什么意思怎么写,看片都有“一库”(日语)是什么意。一库的意思就是“出发,出去”的意思。日语「行く」的音译

知识

外租无人机广告怎么写(植保无人机广告语)

阅读(6992)

本文主要为您介绍外租无人机广告怎么写,内容包括求一个无人机创意广告词谢谢巨友们了,求一关于无人机的广告标语,求一关于无人机的广告标语我们公司是做无人机的,新成立的公司,求。DJI大疆创新研发的的MG-1农业植保机专为农村作业环境设计,

知识

河南话que怎么写(河南话的nenna怎么写)

阅读(6526)

本文主要为您介绍河南话que怎么写,内容包括que怎么写,河南话的nenna怎么写,que怎么写。尿一壶(niào yī hú)关系密切,观点一致。例:“他俩今天尿一壶啦。”●尿(niào)⑴、从尿道排泄的液体。⑵、排泄小便。⑶、不放

知识

国学经文的论文怎么写(国学征文该怎么写)

阅读(7106)

本文主要为您介绍国学经文的论文怎么写,内容包括国学征文该怎么写,弟子规的400论文,关于国学经典的征文怎么写。“子曰:“温故而知新,可以为师”……小时,总是觉得国学就是没用的,古人写的话,我们还需要背,每次老师教给我们时,我总是会让思想开一

知识

化学实验总结怎么写(化学实验报告小结怎么写)

阅读(5391)

本文主要为您介绍化学实验总结怎么写,内容包括化学实验总结怎么写,化学实验报告小结怎么写,化学实验小结怎么写。化学实验报告的书写: 一般情况下化学实验报告是根据实验步骤和顺序从七方面展开来写的: 1.实验目的:即本次实验所要达到的目标或

知识

蝴蝶豌豆拼音怎么写(豌豆的拼音是什么)

阅读(5821)

本文主要为您介绍蝴蝶豌豆拼音怎么写,内容包括蝴蝶怎么拼音的,豌豆的拼音是什么,蝴蝶的拼音是什么。豌豆的拼音是[wān dòu]。豌豆是豆科一年生攀援草本,高0.5-2米。全株绿色,光滑无毛,被粉霜。叶具小叶4-6片,托叶心形,下缘具

知识

海绵宝宝用英文怎么说(海绵宝宝用英文怎么说)

阅读(6506)

本文主要为您介绍海绵宝宝用英文怎么说,内容包括海绵宝宝用英语怎么说,海绵宝宝用英文怎么说,海绵宝宝英文名是什么。1. SPONGEBOB SQUAREPANTS 近期很夯的一步卡通影片《海绵宝宝》(SpongeBob SquarePants)是一系

知识

茶盏怎么用(茶盏在茶道中干嘛用)

阅读(5415)

本文主要为您介绍茶盏怎么用,内容包括茶盏怎么用我要写一篇200字左右的茶盏的使用说明,求指教,茶盏在茶道中干嘛用,问一下斗笠盏如何使用现在是不是很少有人使用它,它的意义。苏东坡的名句"从来佳茗似佳人",典型地代表了唐宋及以后的文人墨客,

知识

thinkpad小红点怎么用(怎么学习使用thinkpad小红点)

阅读(7578)

本文主要为您介绍thinkpad小红点怎么用,内容包括怎么学习使用thinkpad小红点,thinkpad小红点怎么用,求教:THINKPAD的小红点使用方法。Thinkpad 小红点最高效的使用方法为:左手拇指按左键,无操作时在左键待命2、右手拇指按右键,同时兼按空格键及