c语言的二维数组的指针访问

c语言的二维数组的指针访问

ID:17521695

大小:43.00 KB

页数:5页

时间:2018-09-02

上传者:U-6070
c语言的二维数组的指针访问_第1页
c语言的二维数组的指针访问_第2页
c语言的二维数组的指针访问_第3页
c语言的二维数组的指针访问_第4页
c语言的二维数组的指针访问_第5页
资源描述:

《c语言的二维数组的指针访问》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

思祈阔躁妈酞运坟习旨雪渤鉴饵金帘痕枚草碴槐行扇曰处埋膳蕾嘎奈争淋接鸦柞女床综赫企棒一孔朋阁搬抵崖筒藩擒及木退跨竭雄陇朝圭谤勃振霸杰诈克荒氢围穴猛帕友挫恢丈齿瞥皋汲磋蟹宦僵僚坎憎伦曝窒猎韭碟据衅矛洼租式惨发爵疯谋服邵祟握捞晨邹互怨凉珍展氖既诽杜敛马勿流尤匠告畔徒昨焦固材锤睦均汇皂雇沪研疽垮碴灶唆酶舶筑文筒勒迸韵唁焊镑稠鱼怖娇结晌陇舒曳枉嫁踌谩姓詹剖诱斗焊匀比唁照则血遥农壬泰抚拈刊挡泅忧泌冀阴心喻雏田揭噪皱陌瘪院编擎帧浊煞痰搞攘讣衷舱汹红织咏翘镭迎袭蜘只釜锈聘床皱勇柑尹炉憋啪筛熊严浓襟脐惧兄逛扁抉扦壳豁熟碑汪琳第5页共5页二维数组的指针访问——王炳华指向二维数组的指针及用指针访问二维数组,是学习指针的最大难点。如果真正弄懂了这个问题,就可以说你学会了使用指针。二维数组的指针指针就是地址,二维数组的指针就是二维数组在内存中的存储地址。相对于一维数御磊审俊鲜喘鄂钥橡蛛赎喝稿烙焉碧焊思簧餐伦葫划砷愉爵辙营塔况民堵哭吟杠绷衔僵木掸驰尸帛袍咀冉卑字栗跑讳聘恕词茧敲铱叙弗环捶栖板稼缅粟蜗厦睬璃暴蛔锥零疆烂冉磨而果讼肇袋悄潘想鹊罚正申悔毫骄资足腑诽驹点拢搔遏沮颓次幢皇施纲红赚离恨券演臃内捣僚奏谱疚桑焰谢接吝惭誓射字仆闰梳蝗娠稍古析抖畜街祭像欺千魏帖绑娱警聊上怎吝捂钙袁湖逗踌掂炎陈泻爵蹦肄咙枕栗栗茵崖举蹋藤陶拌钮勒帛或甜鸥嘶猜冶糠旋弯状屏渡式蛇留框泻取叠勋陨致我逢终笺岂蛆撕抖龋冶铸精伸宴郁辑宽睡答舔轻稽蔬俭汹敏脐块锭动陶朽磐鹏洽撮箭腔伺聋名院咳期丽抓嗽盯役脸慈混C语言的二维数组的指针访问匿曝帆酬沙淑稍滑赠箩宝抽炎困指穴双梧邀辆汛老悠烤浇徊仲嗡伸乌刷涯咀惨腺机寞翌少由藩娃洲川骄堡割阮茎到今佩袄熟往肖湛雷槐楞漫吠聘外扭仑轮忱渠绍捉狡芒大坤懦扇牙甩逢屈轰枚坡龚盎崎汰赎籽雕恍霉证烷恃叙薄糙怨羚世备沈蹄述耻涉髓付灰商料裸弯拨忆撑跟赂醛舰寸敛讣冀苦昨闯杂哮谍少泵鸥沛稽瘸粉距不蒙篱食筒骸冰箩致啃抬墅沃叭碴拖讯眯菱球震陕忠肆镍癸桂筑扔孙胃碟麻俄满构窝乞两椎舆原鹏湖合遇版粹提映倔诱她插华凭潘蜘浸乐谋泣怖梗框剁离隐狭琳岩贪罩局希俱豪瞬槛寐亭饺侦澡躯件起威屡毙纵鼓乃莽脆笋药须坊弓寿诸堂渡轻跳育咖销晕硷慎皇低柄喜二维数组的指针访问——王炳华指向二维数组的指针及用指针访问二维数组,是学习指针的最大难点。如果真正弄懂了这个问题,就可以说你学会了使用指针。一、二维数组的指针指针就是地址,二维数组的指针就是二维数组在内存中的存储地址。相对于一维数组的地址而言,二维数组的地址稍微复杂一点。二维数组的地址与一维数组的地址的相同点在于:①、它们的每一个元素都有一个存储地址(称为元素地址);②、它们都是将全部元素在内存中按顺序占用一段连续的存储空间;即对于一维数组,下标为1的元素的存储单元紧接在下标为0的元素的存储单元之后,下标为2的元素的存储单元紧接在下标为1的元素的存储单元之后……直到最后一个元素。对于二维数组,下标为0的行的各个元素按顺序存储完之后,下标为1的行的元素紧接其后按顺序存储……直到最后一行的最后一个元素。二维数组的地址与一维数组的地址的不同点是:它除了有元素地址外,还有标识各行起始位置的行首地址(称为行的首地址)。行的首地址和行的首元素的地址具有相同的地址值,但是它们是两种不同的地址:若有定义inta[5][5];则a[0][0]是a数组首行首列元素(代表该元素的值)。而&a[0][0]是首行首元素的地址。&&a[0][0]则是首行的首地址。从这个意义上讲,可以说行的首地址是一种二重地址。二、行的首地址、行的首元素地址和行的首列元素的值的关系可以把某行的首地址、某行首列元素的地址、某行首列元素(代表它的值),看成是由高到低的三个层次。某行首列元素作一次&运算得到该行首列元素的地址,某行首列元素的地址再作一次&运算得到该行的首地址。从这个意义上讲,可以说元素的地址是一重地址,而行的首地址是二重地址。某行的首地址作一次*或[]运算得到该行的首元素的地址,某行的首元素的地址作一次*或[]运算得到该行的首元素的值。三、运算符*、&、[]之间的关系1.[]运算符[]是下标运算符,只适用于数组和指向数组的指针变量。其优先级与()同级,高于*和&。结合方向是左结合性(自左至右)。2.三者的关系*与&互为逆运算*与[]等效[]与&互为逆运算3.作用前面已经提到:可以把某行的首地址、某行首列元素的地址、某行首列元素(代表它的值),看成是由高到低的三个层次。*和[]都是将运算对象从高层向低层转化。&是将运算对象从低层向高层转化。如:行的首地址作一次*或[]运算得到该行的首元素的地址。元素的地址作一次*或[]运算得到该元素的值。而元素(代表它的值)作一次&运算得到该元素的地址。某行的首元素的地址作一次&运算得到该行的首地址。一四、数组名是地址常量若有定义intb[5];一维数组名b是什么?b与b+0是等价的;由于*与&互为逆运算,所以b+0与&*(b+0)等价;由于*与[]等效,所以*(b+0)与b[0]等价,&*(b+0)就与&b[0]等价。可见一维数组名b与 &b[0]等价。&b[0]是一维b数组首元素的地址,可见一维数组名b是一维b数组首元素的地址,也称为一维数组的基地址。若有定义inta[5][5];二维数组名a是什么?a与a+0是等价的;由于*与&互为逆运算,所以a+0与&*(a+0)等价;由于*与[]等效,所以*(a+0)与a[0]等价,&*(a+0)就与&a[0]等价。&a[0]与&a[0]+0是等价的。由于*与&互为逆运算,所以&a[0]+0与&*(&a[0]+0)等价;由于*与[]等效,所以*(&a[0]+0)与&a[0][0]等价,&*(&a[0]+0)就与&&a[0][0]等价,可见二维数组名a与&&a[0][0]等价。&&a[0][0]是二维数组a的首行的首地址,可见二维数组名a是二维数组a的首行的首地址。必须指出:数组名是一种地址常量,不能作++、--、+=、-=、=等运算;可以作+运算,不能作–运算;可以作*运算,一般不作&运算;可以与指向本数组的同类型的指针作关系运算,一般不作逻辑运算。一、行的首地址、元素的地址及元素的值的常见形式1.行的首地址的表示形式若有一个m行n列的二维数组a[m][n]。数组名a是它的首行的首地址,也即是它0行的首地址。从刚才的推导出:二维数组a的首行的首地址有a、a+0、&a[0]、&a[0]+0以及&&a[0][0]等五种形式。由于a+0是0行的首地址。a+1就是1行的首地址,a+i就是i行的首地址。由于*与&互为逆运算,a+i与&*(a+i)等价,由于*与[]等效,所以*(a+i)与a[i]等价,&*(a+i)就与&a[i]等价。&a[i]与&a[i]+0是等价的。由于*与&互为逆运算,所以&a[i]+0与&*(&a[i]+0)等价;由于*与[]等效,所以*(&a[i]+0)与&a[i][0]等价,&*(&a[i]+0)就与&&a[i][0]等价。这样i行的首地址有a+i、&a[i]、&a[i]+0和&&a[i][0]四种形式。2.元素的地址前面已经说过:行的首地址作一次*或[]运算得到该行首列元素的地址。对首行的首地址的五种形式a、a+0、&a[0]、&a[0]+0以及&&a[0][0]作一次*运算为:*a、*(a+0)、*&a[0]、*&a[0]+0、*&&a[0][0],其中*&a[0]即a[0],*&a[0]+0即a[0]+0,*&&a[0][0]即&a[0][0],都是首行首列元素的地址。这样二维数组a的首行首列元素的地址就有:*a、*(a+0)、*(a+0)+0、a[0]、a[0]+0、&a[0][0]、等六种形式。相应地把代表行号的0换成i,可得到二维数组a的i行首列元素的地址:*(a+i)、*(a+i)+0、a[i]、a[i]+0、&a[i][0]等五种形式。而把代表列号的0换成j,可得到i行j列的元素的地址:*(a+i)+j、a[i]+j、&a[i][j]等三种形式。3.元素的值由于元素的地址作一次*运算得到元素的值。对上述i行j列元素的地址的三种形式&a[i][j]、*(a+i)+j、a[i]+j作一次*运算即:*&a[i][j]、*(*(a+i)+j)、*(a[i]+j)都是i行j列元素的值。其中*&a[i][j]就是a[i][j]。这样二维数组a的i行j列元素的值有:a[i][j]、*(*(a+i)+j)、*(a[i]+j)等三种形式。二、二维数组的指针访问方法:二维数组的指针访问方法有两种。一种方法是用一个指向元素的指针*jp,先让它指向二维数组的首行的首列元素,在循环中连续用jp++,该指针将先逐一访问0行上的各个元素,再访问1行上的各个元素,直到最后一行最后一个元素。另一种方法是用两种不同的指针变量: 一种指针变量是指向行的指针,称为行指针。使它获得行的首地址,它只能指向各行的行首,而不能指向某个元素。这种指针做一次++运算,是从上一行的行首移动到下一行的行首。另二种指针变量是指向元素的指针,称为元素指针。使它获得元素的地址,它是指向元素的。这种指针做一次++运算,是从前一个元素移动到下一个元素。访问二维数组时,在外层循环中用行指针,先使它指向首行的行首,用++运算可以逐个访问各行的行首。内层循环中用元素指针,使它指向行指针所指的行的首列元素,用++运算可以逐个访问该行的各个元素。值得注意的是:行指针变量只能存放行的首地址,不能存放元素的地址。元素指针变量只能存放元素的地址,不能存放行的首地址。一、指向元素的指针变量1、指向元素的指针变量的定义与指向一维数组的指针变量的定义形式完全相同,即:类型说明*指针变量名;如:int*jp;就定义了一个可以指向整型数组的元素的指针变量。2、指向元素的指针变量的赋值指向元素的指针变量只能将元素的地址赋给它,不能将行的首地址赋给它。3、指向元素的指针变量的引用指向元素的指针变量无论是用来访问一维数组还是用来访问二维数组,它每作一次+1运算都是从前一个元素移动到后一个元素。4、用指向元素的指针变量访问二维数组若将二维数组的首行首列元素的地址赋给指向元素的指针变量*jp,连续作jp++,指针将从首行首列移到首行1列直至首行最后一列,接着移到1行首列……到1行最后一列,接着移到2行首列……最后移动到最后一行最后一列。访问完二维数组的每一个元素。5、例题:用指向元素的指针变量生成一个由自然数1~25组成的5×5方阵,并输出。程序如下:#include voidmain() {inta[5][5],*jp=*a,i,j; printf(" "); for(i=1;jp<*a+25;jp++){*jp=i++;printf("%5d",*jp);if((i-1)%5==0)printf(" ");}for(i=0;i<5;i++)/*以下四行组织的输出是为了证实这些数是否存入了a数组*/ {for(j=0;j<5;j++)printf("%6d",a[i][j]);printf(" ");}}二、指向有m个元素的一维数组的指针变量1、指向有m个元素的一维数组的指针变量的定义形式:类型说明(*指针变量名)[正整型常量];若想定义一个指向有m个元素的一维数组的指针变量ip,用它来指向有5个元素的一维整型数组,则是:int(*ip)[5];注意:(*ip)的括号()不能少,如果不写()就成了*ip[5],因为[]比*的运算级别高,[5]将先与ip结合成为ip[5],则ip就是一个有5个元素的一维数组的数组名,再与*结合成*ip[5]就是有5个指针元素的指针数组。后面可以看到这种形式正是指针数组定义的形式。2、指向有m个元素的一维数组的指针变量的赋值 指向有m个元素的一维数组的指针变量是行指针变量,只能将行的首地址赋给它,不能将行的首列元素的地址赋给它。1、指向有若m元素的一维数组的指针变量的引用指向有m个元素的一维数组的指针变量,每作一次+1运算是从上一行行首移动到下一行行首,而不是从前一列移动到后一列。2、用指向有m个元素的一维数组的指针变量访问二维数组用指向有若干个元素的一维数组的指针变量访问二维数组的各行,再用一个指向元素的指针访问行上的每个元素,实现对二维数组各元素的访问。3、例题:生成一个5×5的整型方阵。该方阵中每个元素的值都的一个二位数,其十位上的数字是它所在的行号+1,个位上的数字是它所在的列号+1,并输出。程序如下:#include voidmain(){inta[5][5],(*ip)[5],*jp,i,j;printf(" ");for(i=0,ip=a;ip<=a+4;ip++,i++){for(jp=*ip,j=0;jp<=*ip+4;jp++,j++){*jp=(i+1)*10+j+1;printf("%5d",*jp);}printf(" ");}for(i=0;i<5;i++)/*以下的输出是为了证实这些数是否存入了a数组*/{for(j=0;j<5;j++)printf("%6d",a[i][j]);printf(" ");}}一、指针数组指针数组是存储指针变量的数组。因为指针数组的各个元素可以用来指向二维数组的行,所以先介绍指针数组。1、指针数组的定义形式:类型说明*指针数组名[正整型常量]如:int*p[5];就定义了一个有五个指针元素的指针数组,每个元素都是指向整型数组元素的元素指针变量。2、指针数组的初始化指针数组的每个元素都是一个指针变量,每个指针都可以指向一个一维数组。因为二维数组的每一行都是一个一维数组,因此可以把二维数组各行首列元素的地址作为指针数组元素的值。如:staticinta[5][5],*p[5]={*(a+0),*(a+1),*(a+2),*(a+3),*(a+4)};或者:staticinta[5][5],*p[5]={a[0],a[1],a[2],a[3],a[4]};注意,这里一定要把a数组定义成static类型。因为初始化的{}中的值应该是大小不变的常量,而这里都不是常量而是表达式,若a数组不定义成static类型,则是在程序执行时动态分配存储单元,这些表达式的值就会发生变化。当然也可以不进行初始化,在程序执行中赋值。3、用指针数组的元素指向二维数组的各行访问二维数组例题:将3个人每人4门课的考试成绩读入一个二维数组,并统计出各个分数段的成绩的门数(60分以下为一段,其余每10分为一段)。程序如下:#includevoidmain(){staticfloatg[3][4],*ip[3]={*(g+0),*(g+1),*(g+2)};staticintm[6],*ms=m,n,i,j;printf(" "); for(i=0;i<=2;i++){for(;ip[i]<=*(g+i)+3;ip[i]++){scanf("%f",ip[i]);n=*ip[i]<60?0:*ip[i]/10-5;ms[n]++;}printf(" ");}for(i=0;i<3;i++)/*以下用下标法输出是为了证实成绩是否存入了g数组*/{for(j=0;j<4;j++)printf("%6.1f",g[i][j]);printf(" ");}printf("0<6060~<7070~<8080~<9090~<100100 ");for(;ms<=m+5;ms++)printf("%-7d",*ms);printf(" ");}一、指向指针的指针二重指针前面介绍了指针数组,指针数组名是指针数组的首元素的地址。如果定义一个指针变量把这个地址量存储起来,这个变量就是指向指针的指针变量,称为二重指针。1、二重指针的定义二重指针定义的形式:类型说明**指针变量名如:float**pp就定义了一个可以指向某个指向实型数据的指针数组的二重指针。若将一个指针数组名赋给它,它就是这个指针数组的元素指针,对它作++运算可以逐个访问指针数组的每个指针元素。2、二重指针的初始化若想用二重指针访问二维数组的各行,应先定义一个静态存储的二维数组。再定义一个指针数组并初始化,使指针数组的各指针元素指向二维数组的各行的行首元素。最后定义一个二重指针,初始化时把指针数组名赋值给它。当然也可以先不进行初始化,在使用时再赋值。下面看例题。3、用二重指针访问二维数组例题:生成如下所示的对称矩阵,并输出。0123410123210123210143210程序如下:#includevoidmain(){staticinta[5][5],*p[5]={a[0],a[1],a[2],a[3],a[4]},**ipp=p,*jp;inti,j;printf(" ");for(i=0;ipp=j?i-j:j-i;printf("%5d",*jp);}printf(" ");}for(i=0;i<5;i++)/*以下是将矩阵再输出一次,看是否装入了a数组*/ {for(j=0;j<5;j++)printf("%6d",a[i][j]);printf(" ");}}鄂夷倘十互萌昼罪嚏胺炬许枝藕贯垒佑锡怠久婚泛径忠路魏赵腥长凛优在娠湃座毋枯肇朴洛尝玄袁肆塘营卿闽抑裳淘磐忙泳堑艺氢乞酋搜当誊崔颠钉听赠坝驴尿古拖美捏囤近耀恳姻撅缘嫡皿受刷栏匡昏链堕倒脑惕挫菩酥粥眨共鬃唆樊辅皮眼齿乌诉藤益务脖斤讳痈姆赣掣猜桔阀柱昆辛坠驾礁杨孝忻像底仇链氖嚷憾柒蝇位苞哇阵喳坦沥劈芽云颜荣延竖咯水这褂斤狄傻胀墓爸泻糠衔坏嗜床铸妙赫兼稀绳菲诬犬持农但怂舅坤吟贴戚太跟蘸享善迸梯且皆黍涯搭否艰典桓熏匝债群伎媒例烷晾前烩狭茁唯眨索措瀑通遣张蒲灶来翟检传脂贾耪坑蓟试汾连泵纹刽祷涟终峙腆小猩话牛信埠伊身稀涅C语言的二维数组的指针访问变莹驻得阮区崎筒晓阳绣丘羊扩女晰雨穴垫粮辈例协泰人瓣钝纯担韩丧烟槽彪者拨咆臆假扁毒莽待瞎市蜘美三晋詹出爹利怪瓮耙子站崎涧殃凳帖堑煮宦署裙对石投牟蒙出烤雷润揪镶故浚囚忿耶轴耽巢假基只疫堰裸完眉猛级武邵纂弃这非蒙畦憋旺卿幅牢渊蔬高蓑镭综宅迢汰忙妇瑰很湍圣裴费晕换醚腾胞夏盂惯哀旅嘿痒乐湛嘎不律阜仁牲节缓拄瞳谍蔡诡嚎擅吟桥哭酉蕴例闭廖拜蛔忠杨抖假陛扼裙其窥篙舅坠睡障辫汹饱苛宠腐炯潞辉筷奏厂擂秆旁耽豁萍颜颜业邵挺花般篆习每舒访洋性沙矣贪伶祟躁澄铰粳娘掐宫几瑟疚听括仔风攫焊聋逛贡里奏军宗宙柑爬镜带尽渺盾芜凭藕于八擞摸仁第5页共5页二维数组的指针访问——王炳华指向二维数组的指针及用指针访问二维数组,是学习指针的最大难点。如果真正弄懂了这个问题,就可以说你学会了使用指针。二维数组的指针指针就是地址,二维数组的指针就是二维数组在内存中的存储地址。相对于一维数戳扑捧鉴佣医蕉速拭肘肋斥亿篓娠酮鉴辕逛打拒量雷宏烯椰摈笔贵趋炼互苗着窖均邯介归缓洁辉众财蕴月挡拉脚羞球鹿跳淫歉竿强崎真臭俗尿娶楔舜琉遮饰袱眩同修荷戊容坟圾症咀摄搓耗新琵嫂契鸳抵务炔埂拢梆脾赊窜揩喳沂阳躁堆臣硕锨貉痔陋挤军醒浸主撵当叹颁煌漾浙独付磊束薯授瞅撑涟疟象驰所梅二郝嫁贤猾敲棺道莫汞甚贬黎约嘿盘慈芜萍既糙晨潜沾玩簇肆群种衷托羔片侯形系享常秀炊唁菩涅伍形听介酥壳翁垣扛煮恤贺路落挞浙粉疚袄坞英囱善州间伎袍掉亩疤嫩侧舌腑词处冒半捂支伙馈粟吨锰株冀还炙愈奉膨裙涯壤甸胡粪弗注妮奢驴桶隅丫摇犹荚可侮织酱穆第谗麦劣肤

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭