二维指针数组怎么写

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;

}

二维指针数组怎么写

转载请注明出处育才学习网 » 二维指针数组怎么写

知识

铂金拼音怎么写

阅读(284)

本文主要为您介绍铂金拼音怎么写,内容包括铂金的拼音,铂金的拼音,铂金的读音是什么意思。[ bó jīn ]一种天然形成的白色贵重金属。铂金早在公元前700年就在人类文明史上闪出耀眼的光芒,在人类使用铂金的2000多年历史中

知识

食品安全说明书怎么写

阅读(255)

本文主要为您介绍食品安全说明书怎么写,内容包括关于某食品存在食品安全的情况说明怎么写,列出食品说明书的基本内容,食品安全的字怎么写。资料中小学生应注意哪些饮食卫生习惯?白开水是最好的饮料,一些饮料含有防腐剂、色素等,经常饮用不利于

知识

琴行介绍怎么写

阅读(225)

本文主要为您介绍琴行介绍怎么写,内容包括琴行的介绍,请高指点迷经关于介绍自己的优点如果我想在钢琴琴行工作应,纯音琴行简介。琴行是一种集乐器销售和培训为一体的商业行为,在西方发达国家,国民掌握一门乐器的比例达到总人口的百分之十以上

知识

欠条写的货款怎么起诉

阅读(249)

本文主要为您介绍欠条写的货款怎么起诉,内容包括欠我货款写了欠条如何起诉讼,有人欠我的货款有欠条总是不还我想去法院起诉他应该怎么做呢具,标题写欠条,内容写的借款怎么打官司。你准备好以下资料后,向被告户籍所在地法院或供货合同签订地

知识

空心字八怎么写

阅读(274)

本文主要为您介绍空心字八怎么写,内容包括8的空心字怎么写,8的空心字怎么写,8的空心字怎么写告诉我8的空心字。大写的八:捌(如下图)捌,古代的意思是一种聚拢谷物的没有齿的耙。现在通常用于记账时作八的大写,如:捌仟元整。用作动词时,可以做扒开解

知识

开放时间的英文怎么写

阅读(241)

本文主要为您介绍开放时间的英文怎么写,内容包括开放时间的英文怎么说,开放时间用英语怎么写,开放时间用英语怎么说。营业时间用英文:business hours例:What are your business hours? 你们的营业时间是怎样?词汇解

知识

回以前公司上班怎么写

阅读(263)

本文主要为您介绍回以前公司上班怎么写,内容包括回原单位上班申请书怎么写,怎么回以前的公司上班,我想回以前公司上班怎么跟老板说啊。恢复工作申请书尊敬的领导:您好!首先感谢领导能在百忙中抽出时间来阅读我的申请。我叫XX(姓名),原是本单位XX

知识

对不对的呀怎么写

阅读(201)

本文主要为您介绍对不对的呀怎么写,内容包括我这段代码写的对不对呀,若写的不对怎么修改呀,若写的对,什么,对不对,怎么写,这道题这么写对吗不对的话该怎么写着急啊快一点哦。var h = 100, sum = 0;for (var i =1; i <= 10; i++) {sum = sum

知识

给城管局的函怎么写

阅读(251)

本文主要为您介绍给城管局的函怎么写,内容包括给城管部门的告知函怎么写,致政府部门的函要怎么写,给城管局的道歉信怎么写。邀请函的相关资料 (一)邀请函的格式: 邀请信是邀请亲朋好友或知名人士、专家等参加某项活动时所发的请约性书信。它是

知识

忌的楷书怎么写

阅读(205)

本文主要为您介绍忌的楷书怎么写,内容包括答的楷书写法如何写,不的楷书怎么写,常字的楷书怎样写。讲究用笔楷书钢笔字的笔画有提顿、藏露、方圆、快慢等用笔方法。不同的用笔方法产生不同的形态、质感的线条,不同的线条需要不同的用笔方法去

知识

精卫填海用篆书怎么写

阅读(718)

本文主要为您介绍精卫填海用篆书怎么写,内容包括精卫填海简写50字,精卫填海简写,精卫填海翻译。精卫填海简写太阳神炎帝有一个小女儿,名叫女娃,是他最钟爱的女儿。炎帝不仅管太阳,还管五谷和药材。他事情很多,每天一大早就要去东海,指挥太

知识

酒店收银保证怎么写

阅读(246)

本文主要为您介绍酒店收银保证怎么写,内容包括收银担保书怎么写呢,怎么写酒店收银工作总结,酒店收银员工作总结怎么写。某酒店2008年度酒店客房工作总结报告2008年的工作是酒店也是部门扎基础的重要阶段,房务部根据酒店总体计划,在酒店领导的

知识

考试的注意事项怎么写

阅读(263)

本文主要为您介绍考试的注意事项怎么写,内容包括小学生考试注意事项,考试时的注意事项,考试注意事项。小学生考试应该注意事项 准备充分,忙中有序试前的准备是否充分对临场的情绪状态和水平的发挥有重要的影响。试前准备包括心理、知识的准

知识

面试offer怎么写

阅读(202)

本文主要为您介绍面试offer怎么写,内容包括怎么写offer邮件,HR说了给发OFFER之后就一定会发吗,面试过程中到底要怎么表现,才能拿到offer啊。录用通知书offer模板Dear XXX :我非常高兴地通知您,经过我公司的面试和讨论,我们一致认为您是我公司

知识

matlab细胞数组怎么写

阅读(221)

本文主要为您介绍matlab细胞数组怎么写,内容包括MATLAB细胞数组的创建和操作,matlab怎么定义一维数组,怎么求matlab细胞数组最大值。1,一维数组输入在matlab中,基本的运算单元是无需指定维数的数组。一维数组在数学上常称2113为向量,如下所示,

知识

表单数组怎么写

阅读(212)

本文主要为您介绍表单数组怎么写,内容包括在表单属性中如何定义数组,js如何获取表单中数组的值,在表单属性中如何定义数组。n="/empdelete.do" method="post"></form>这里的action要对应struts-config.xml

知识

传数组_iow第三个参数怎么写

阅读(223)

本文主要为您介绍传数组_iow第三个参数怎么写,内容包括数组参数怎么写,对sempo第三个参数nsops怎样理解请大神详解啊,EXCEL函数中,networkdays函数第三个参数怎么用。通常,调用的过程所包含的参数不能超出过程声明指定的数目。当需要数量不

知识

九天玄数的数组怎么写

阅读(201)

本文主要为您介绍九天玄数的数组怎么写,内容包括九天玄数教什么,有知道张光辉的九天玄数吗谢谢,阿拉伯数字&#39;9&#39;大写怎么写。九天玄数相传九天玄女遗留在民间的一部易学宝典,她源于周易,而又高于周易!是一门大道至简至易的旷世奇术。九

知识

php数组数据库怎么写

阅读(249)

本文主要为您介绍php数组数据库怎么写,内容包括PHP数组,如何写入mysql数据库,php中二维数组怎么写入到数据库,PHP添加数组到数据库。<?php $info=$_POST[info] ; $values = ""; for($i = 0; $i < count($inf

知识

怎么写php数组代码

阅读(243)

本文主要为您介绍怎么写php数组代码,内容包括php数组赋值方法,如何用PHP语言创建数组,redis如何存一个PHP数组代码怎么写呢。PHP有自带的高性能函数 var_exportconn.php<?php$dbconfig = array (host=>127.0.0

知识

javachar数组怎么写

阅读(293)

本文主要为您介绍javachar数组怎么写,内容包括java中怎么输入char数组,java的char[]数组,怎样用java输入一个char型的二维数组。import java.util.*;public class Test{public static void main(String[

知识

指针表达式怎么写

阅读(220)

本文主要为您介绍指针表达式怎么写,内容包括什么叫指针表达式,指针表达式怎么确定指针表达式是一个左值,什么叫指针表达式。先教你一个区分左值和右值的方法:你可以试着对表达式进行取址操作,如果表达式不能进行取址的话,那么就可以看做右值。

[/e:loop]