已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
二维数组的指针访问王炳华指向二维数组的指针及用指针访问二维数组,是学习指针的最大难点。如果真正弄懂了这个问题,就可以说你学会了使用指针。一、 二维数组的指针指针就是地址,二维数组的指针就是二维数组在内存中的存储地址。相对于一维数组的地址而言,二维数组的地址稍微复杂一点。二维数组的地址与一维数组的地址的相同点在于:、它们的每一个元素都有一个存储地址(称为元素地址);、它们都是将全部元素在内存中按顺序占用一段连续的存储空间;即对于一维数组,下标为1的元素的存储单元紧接在下标为0的元素的存储单元之后,下标为2的元素的存储单元紧接在下标为1的元素的存储单元之后直到最后一个元素。对于二维数组,下标为0的行的各个元素按顺序存储完之后,下标为1的行的元素紧接其后按顺序存储直到最后一行的最后一个元素。二维数组的地址与一维数组的地址的不同点是:它除了有元素地址外,还有标识各行起始位置的行首地址(称为行的首地址)。行的首地址和行的首元素的地址具有相同的地址值,但是它们是两种不同的地址:若有定义int a55;则a00是a数组首行首列元素(代表该元素的值)。而&a00是首行首元素的地址。&a00则是首行的首地址。从这个意义上讲,可以说行的首地址是一种二重地址。二、 行的首地址、行的首元素地址和行的首列元素的值的关系可以把某行的首地址、某行首列元素的地址、某行首列元素(代表它的值),看成是由高到低的三个层次。某行首列元素作一次&运算得到该行首列元素的地址,某行首列元素的地址再作一次&运算得到该行的首地址。从这个意义上讲,可以说元素的地址是一重地址,而行的首地址是二重地址。某行的首地址作一次* 或 运算得到该行的首元素的地址,某行的首元素的地址作一次* 或 运算得到该行的首元素的值。三、 运算符 *、&、 之间的关系1 运算符 是下标运算符,只适用于数组和指向数组的指针变量。其优先级与( )同级,高于 * 和& 。结合方向是左结合性(自左至右)。2 三者的关系* 与 & 互为逆运算* 与 等效 与 & 互为逆运算3 作用前面已经提到:可以把某行的首地址、某行首列元素的地址、某行首列元素(代表它的值),看成是由高到低的三个层次。* 和 都是将运算对象从高层向低 层转化。& 是将运算对象从低层向高层转化。如:行的首地址作一次* 或 运算得到该行的首元素的地址。 元素的地址作一次* 或 运算得到该元素的值。而元素(代表它的值)作一次&运算得到该元素的地址。 某行的首元素的地址作一次&运算得到该行的首地址。一四、 数组名是地址常量若有定义int b5;一维数组名b是什么?b与b+0 是等价的;由于* 与 & 互为逆运算,所以b+0 与&*(b+0) 等价;由于* 与 等效,所以*(b+0) 与b0 等价,&*(b+0)就与&b0 等价。可见一维数组名b与&b0 等价。&b0 是一维b数组首元素的地址,可见一维数组名b是一维b数组首元素的地址,也称为一维数组的基地址。若有定义int a55;二维数组名a是什么?a与a+0 是等价的;由于* 与 & 互为逆运算,所以a+0 与&*(a+0) 等价;由于* 与 等效,所以*(a+0) 与a0 等价,&*(a+0)就与&a0 等价。&a0与&a0+0是等价的。由于* 与 & 互为逆运算,所以&a0+0与&*(&a0+0) 等价;由于* 与 等效,所以*(&a0+0) 与&a00 等价,&*(&a0+0) 就与&a00 等价,可见二维数组名a与&a00 等价。&a00 是二维数组a的首行的首地址,可见二维数组名a是二维数组a的首行的首地址。必须指出:数组名是一种地址常量,不能作+、 -、+=、- = 、= 等运算;可以作+运算,不能作 运算;可以作* 运算,一般不作&运算;可以与指向本数组的同类型的指针作关系运算,一般不作逻辑运算。五、 行的首地址、元素的地址及元素的值的常见形式1 行的首地址的表示形式若有一个m行n列的二维数组a mn 。数组名a是它的首行的首地址,也即是它0行的首地址。从刚才的推导出:二维数组a 的首行的首地址有a 、 a+0 、 &a0 、&a0+0以及&a00等五种形式。由于a+0是0行的首地址。a+1就是1行的首地址,a+i就是i行的首地址。由于* 与 & 互为逆运算,a+i与&*(a+i) 等价,由于* 与 等效,所以*(a+i) 与ai 等价,&*(a+i)就与&ai 等价。&ai与&ai+0是等价的。由于* 与 & 互为逆运算,所以&ai+0与&*(&ai+0) 等价;由于* 与 等效,所以*(&ai+0) 与&ai0 等价,&*(&ai+0) 就与&ai0 等价。这样i行的首地址有a+i 、 &ai 、&ai+0和&ai0 四种形式。2 元素的地址前面已经说过:行的首地址作一次* 或 运算得到该行首列元素的地址。对首行的首地址的五种形式a 、 a+0 、 &a0 、&a0+0以及&a00作 一次* 运算为:* a 、 * (a+0)、* &a0 、*&a0+0、*&a00 ,其中 * &a0即a0 ,*&a0+0即a0+0,*&a00即&a00,都是首行首列元素的地址。这样二维数组a 的首行首列元素的地址就有:* a 、 * (a+0)、* (a+0)+0、a0 、a0+0 、&a00、等六种形式。相应地把代表行号的0换成i,可得到二维数组a 的i行首列元素的地址:* (a+i)、* (a+i)+0、ai 、 ai+0、&ai0等五种形式。而把代表列号的0换成j,可得到 i行j列的元素的地址:* (a+i)+j、ai+j 、&aij等三种形式。3 元素的值由于元素的地址作一次* 运算得到元素的值。对上述i行j列元素的地址的三种形式&aij、* (a+i)+j、ai+j作一次* 运算即:*&aij、* ( * (a+i)+j )、* (ai+j ) 都是i行j列元素的值。其中*&aij 就是aij 。这样二维数组a 的i行j列元素的值有:aij 、* ( * (a+i)+j )、* (ai+j ) 等三种形式。六、 二维数组的指针访问方法:二维数组的指针访问方法有两种。一种方法是用一个指向元素的指针*jp,先让它指向二维数组的首行的首列元素,在循环中连续用jp+,该指针将先逐一访问0行上的各个元素,再访问1行上的各个元素,直到最后一行最后一个元素。另一种方法是用两种不同的指针变量:一种指针变量是指向行的指针,称为行指针。使它获得行的首地址,它只能指向各行的行首,而不能指向某个元素。这种指针做一次+运算,是从上一行的行首移动到下一行的行首。另二种指针变量是指向元素的指针,称为元素指针。使它获得元素的地址,它是指向元素的。这种指针做一次+运算,是从前一个元素移动到下一个元素。访问二维数组时,在外层循环中用行指针,先使它指向首行的行首,用+运算可以逐个访问各行的行首。内层循环中用元素指针,使它指向行指针所指的行的首列元素,用+运算可以逐个访问该行的各个元素。值得注意的是:行指针变量只能存放行的首地址,不能存放元素的地址。元素指针变量只能存放元素的地址,不能存放行的首地址。七、 指向元素的指针变量1、 指向元素的指针变量的定义与指向一维数组的指针变量的定义形式完全相同,即:类型说明 * 指针变量名;如:int * jp ; 就定义了一个可以指向整型数组的元素的指针变量。2、 指向元素的指针变量的赋值指向元素的指针变量只能将元素的地址赋给它,不能将行的首地址赋给它。3、 指向元素的指针变量的引用指向元素的指针变量无论是用来访问一维数组还是用来访问二维数组,它每作一次+1运算都是从前一个元素移动到后一个元素。4、 用指向元素的指针变量访问二维数组若将二维数组的首行首列元素的地址赋给指向元素的指针变量 * jp ,连续作 jp+ , 指针将从首行首列移到首行1列直至首行最后一列,接着移到1行首列到1行最后一列,接着移到2行首列最后移动到最后一行最后一列。访问完二维数组的每一个元素。5、 例题:用指向元素的指针变量生成一个由自然数125组成的55方阵,并输出。程序如下:#include void main()int a55,*jp=*a, i, j; printf(n); for(i=1;jp*a+25;jp+ ) *jp=i+; printf(%5d,*jp); if(i-1)%5=0) printf(n); for(i=0;i5;i+) /* 以下四行组织的输出是为了证实这些数是否存入了a数组*/ for(j=0;j5;j+) printf(%6d,aij); printf(n); 八、 指向有m个元素的一维数组的指针变量1、 指向有m个元素的一维数组的指针变量的定义形式:类型说明 (* 指针变量名)正整型常量;若想定义一个指向有m个元素的一维数组的指针变量 ip ,用它来指向有5个元素的一维整型数组,则是:int ( * ip ) 5 ;注意:( *ip )的括号()不能少,如果不写()就成了 * ip 5 , 因为 比* 的运算级别高,5将先与ip 结合成为 ip5 , 则ip 就是一个有5个元素的一维数组的数组名,再与* 结合成 * ip5 就是有5个指针元素的指针数组。后面可以看到这种形式正是指针数组定义的形式。2、 指向有m个元素的一维数组的指针变量的赋值指向有m个元素的一维数组的指针变量是行指针变量,只能将行的首地址赋给它,不能将行的首列元素的地址赋给它。3、 指向有若m元素的一维数组的指针变量的引用指向有m个元素的一维数组的指针变量,每作一次 + 1 运算是从上一行行首移动到下一行行首,而不是从前一列移动到后一列。4、 用指向有m个元素的一维数组的指针变量访问二维数组用指向有若干个元素的一维数组的指针变量访问二维数组的各行,再用一个指向元素的指针访问行上的每个元素,实现对二维数组各元素的访问。5、 例题:生成一个55的整型方阵。该方阵中每个元素的值都的一个二位数,其十位上的数字是它所在的行号+1,个位上的数字是它所在的列号+1,并输出。程序如下:#include void main() int a55,(*ip)5,*jp,i,j; printf(n); 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(n); for(i=0;i5;i+) /* 以下的输出是为了证实这些数是否存入了a数组*/ for(j=0;j5;j+) printf(%6d,aij); printf(n); 九、 指针数组指针数组是存储指针变量的数组。因为指针数组的各个元素可以用来指向二维数组的行,所以先介绍指针数组。1、 指针数组的定义形式:类型说明 * 指针数组名正整型常量如:int * p5 ;就定义了一个有五个指针元素的指针数组,每个元素都是指向整型数组元素的元素指针变量。2、 指针数组的初始化指针数组的每个元素都是一个指针变量,每个指针都可以指向一个一维数组。因为二维数组的每一行都是一个一维数组,因此可以把二维数组各行首列元素的地址作为指针数组元素的值。如:static int a55 , *p5=* (a+0), * (a+1), * (a+2), * (a+3), * (a+4);或者:static int a55 , *p5=a0, a1, a2, a3, a4; 注意,这里一定要把a数组定义成static 类型。因为初始化的 中的值应该是大小不变的常量,而这里都不是常量而是表达式,若a数组不定义成static 类型,则是在程序执行时动态分配存储单元,这些表达式的值就会发生变化。当然也可以不进行初始化,在程序执行中赋值。3、 用指针数组的元素指向二维数组的各行访问二维数组例题:将3个人每人4门课的考试成绩读入一个二维数组,并统计出各个分数段的成绩的门数(60分以下为一段,其余每10分为一段)。程序如下:#include void main()static float g34,*ip3=*(g+0),*(g+1),*(g+2); static int m6,*ms=m,n,i,j; printf(n); for(i=0;i=2;i+) for(;ipi=*(g+i)+3;ipi+) scanf(%f,ipi); n=*ipi60?0:*ipi/10-5; msn+; printf(n); for(i=0;i3;i+) /* 以下用下标法输出是为了证实成绩是否存入了g数组*/ for(j=0;j4;j+) printf(%6.1f,gij); printf(n); printf(060 6070 7080 8090 90100 100n); for(;ms=m+5;ms+) printf( %-7d,*ms); printf(n);十、 指向指针的指针 二重指针前面介绍了指针数组,指针数组名是指针数组的首元素的地址。如果定义一个指针变量把这个地址量存储起来,这个变量就是指向指针的指针变量,称为二重指针。1、 二重指
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 14392.2-2025国际贸易单证样式第2部分:电子单证
- 2025年二级建造师考试试题一汇编附答案详解
- 2025年导游资格证考试历年真题汇编及答案解析套装
- 中小学生交通安全计课件
- 2026年终自我鉴定
- 应急救援知识考试试题及答案
- 建筑信息模型(BIM)应用技术试题及答案
- 开学第一课主题班会(教案4篇)
- 技师公共基础试题及答案
- 招聘教师考试《教育公共基础知识》试题及答案解析
- 2025西藏华泰龙矿业开发有限公司招聘39人笔试历年典型考点题库附带答案详解试卷2套
- 2025年六西格玛绿带题库及答案
- 2025年河北石家庄市直事业单位公开选调工作人员173名考试笔试模拟试题及答案解析
- 公务接待礼仪及物资准备清单
- 全国大学生职业规划大赛《道路工程检测技术》专业生涯发展展示【高职(专科)】
- 感恩教育:“心怀感恩向阳而行”-2025-2026学年高中主题班会
- 2025秋期版国开电大本科《心理学》一平台形成性考核练习1至6在线形考试题及答案
- “巴渝工匠”杯第十三届青年职业技能大赛(全媒体运营师赛项)备赛试题库(含答案)
- SAP系统切换策略及系统并行
- 新媒体文案创作与传播-新媒体文案概述
- 国家开放大学《人文英语4》边学边练参考答案
评论
0/150
提交评论