欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    const指针六二维数组.ppt

    • 资源ID:70755918       资源大小:338.49KB        全文页数:27页
    • 资源格式: PPT        下载积分:11.9金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要11.9金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    const指针六二维数组.ppt

    五、五、const指针指针 六、二维数组六、二维数组 1五、五、const指针指针 普通指针是没有普通指针是没有const约束的指针,这样的指针本身既约束的指针,这样的指针本身既可以变动,其指向的内存单元也可更新。可以变动,其指向的内存单元也可更新。普通指针普通指针p进行两种运算:进行两种运算:一种是指针的加减寻址运算,如一种是指针的加减寻址运算,如p=&a i,p+,p+=I等,这种运算改变指针本身。等,这种运算改变指针本身。另一种是访问指针运算,如另一种是访问指针运算,如*p=pj,*(p+j)=p0,这,这种种运算读写内存,可改变间接变量而不改变指针。运算读写内存,可改变间接变量而不改变指针。为了清晰界定指针的不同运算,引进为了清晰界定指针的不同运算,引进const指针。指针指针。指针与与const组合派生出三种意义不同的形式。组合派生出三种意义不同的形式。2 第一种形式定义的指针称为只读指针。第一种形式定义的指针称为只读指针。形式为:形式为:const type *r;const 类名类名*只读指针;只读指针;const type *r=地址表达式地址表达式;const 类名类名*只读指针只读指针=数据区的地址;数据区的地址;第一种形式可以不必同时进行初始化,即可以先定义第一种形式可以不必同时进行初始化,即可以先定义r,然后再将该指针指向某个同类型的变量或数组。,然后再将该指针指向某个同类型的变量或数组。只读指针可以在一片只读或非只读的数据区移动,以便只读指针可以在一片只读或非只读的数据区移动,以便将数据只读地复制到其它位置。只读指针既可指向只读区也将数据只读地复制到其它位置。只读指针既可指向只读区也可指向变量或左值区。定义中的关键字可指向变量或左值区。定义中的关键字const限定限定*r为右为右值,具体地说只读指针值,具体地说只读指针r是左值指针,间接变量是左值指针,间接变量*(r+i)或或ri约约束为右值表达式。束为右值表达式。3 第二种形式定义的指针称为固定指针或右值指针。第二第二种形式定义的指针称为固定指针或右值指针。第二种形式为:种形式为:type *const s=左值区的地址左值区的地址;类名类名*const 固定指针固定指针=非只读区的地址;非只读区的地址;第二种形式必须同时用变量或左值的地址进行初始化,第二种形式必须同时用变量或左值的地址进行初始化,除非作为形参。定义中的关键字除非作为形参。定义中的关键字const冻结指针冻结指针s为右值,为右值,*s或或si是左值。是左值。一维数组名一维数组名a就是一个这样的右值地址,就是一个这样的右值地址,r=a是可以是可以的,的,a=r是错误的,这确保数组元素总是可以通过是错误的,这确保数组元素总是可以通过a来索引。来索引。右值指针可以用来接受右值指针可以用来接受new运算符申请动态自由空间成运算符申请动态自由空间成功后的结果值,以避免对堆指针加减的误操作。功后的结果值,以避免对堆指针加减的误操作。4 例例固定指针和只读指针固定指针和只读指针(固定指针和只读指针都可指向普固定指针和只读指针都可指向普通通(非只读非只读)的数组的数组)void intcpy(int*p,const int*q,int n)/只读指针形参只读指针形参q表示表示*q在函数体中为右值。在函数体中为右值。for(int k=0;kn;p+,q+,k+)*p=*q;/左边的函数体与下面程序块等价左边的函数体与下面程序块等价#include /int k=0;while(kn)*p=*q;p+;q+;k+;const int c5=1,2,3,4,5;/定义只读全局数组,每一个数组元素定义只读全局数组,每一个数组元素ck为右值为右值5 void main(void)int a10;int*const s=a;/定义固定指针定义固定指针s,初始化为数组名,初始化为数组名a const int *r=c;int k=0;for(;k5;k+,r+)sk=*r;intcpy(a+5,a,5);for(k=0;k10;k+)cout-ak;/输出结果:输出结果:-1-2-3-4-5-1-2-3-4-56 只读指针本身是可变的,只读指针的间接访问不得改只读指针本身是可变的,只读指针的间接访问不得改写它指向的存储单元。写它指向的存储单元。固定指针本身是不变的,但固定指针指向的存储单元允固定指针本身是不变的,但固定指针指向的存储单元允许更新。许更新。固定指针只读指针都可以指向变量,固定指针和普通指固定指针只读指针都可以指向变量,固定指针和普通指针不指向只读数据区而仅指向左值数据区。针不指向只读数据区而仅指向左值数据区。只读指针本身是可变的,只读指针的间接访问不得改写只读指针本身是可变的,只读指针的间接访问不得改写它指向的存储单元。它指向的存储单元。固定指针本身是不变的,但固定指针指向的存储单元允固定指针本身是不变的,但固定指针指向的存储单元允许更新。许更新。固定指针只读指针都可以指向变量,固定指针和普通指固定指针只读指针都可以指向变量,固定指针和普通指针不指向只读数据区而仅指向左值数据区。针不指向只读数据区而仅指向左值数据区。7例如:例如:const int c5=1,2,3,4,5;/&ci是是const int*型的地址,型的地址,ci是右值表达式是右值表达式 int*const s=c;/错误,定义固定指针指向只读数组错误,定义固定指针指向只读数组c,si可以是左值可以是左值 int*p;/定义一个普通的指针即非只读的指针定义一个普通的指针即非只读的指针p,pi可以是左值可以是左值 p=&c0;/错误,错误,p指向首元素,指向首元素,*p为左值为左值,但但c0为右值,矛盾为右值,矛盾8 固定指针固定指针s指向只读数组首元素指向只读数组首元素,*s可为左值,间接地可为左值,间接地导导致致c0为左值,但这与只读数组的定义矛盾;类似地普通指为左值,但这与只读数组的定义矛盾;类似地普通指针针p不指向只读数组。不可以对只读指针进行左值访问:不指向只读数组。不可以对只读指针进行左值访问:const char*r=abc;/字符串安排在只读数据区,其首地址具有字符串安排在只读数据区,其首地址具有char*属性属性 *r=m;/错误,错误,*r是右值表达式是右值表达式左值区可作为右值区访问。左值区可作为右值区访问。从从int*型转换到型转换到const int*型是默许的。但是反之不型是默许的。但是反之不然,即不将然,即不将const int*型的地址隐含地转换为型的地址隐含地转换为int*型或型或int*const型的指针,除非强制类型转换。型的指针,除非强制类型转换。9例例指针的强制类型转换攻击只读数据区指针的强制类型转换攻击只读数据区#include void swap(int*const s)int t=*s;*s=s1;s1=t;void main()constint a2=1,2;printf(%d,%d;,a0,*(a+1);int*p=(int*)(a+1);printf(%d,%d-,p-1=3,*p=4);swap(int*)&a 0);printf(%d,%d,*a,a 1);10 第三种形式定义的指针可称为只读的固定指第三种形式定义的指针可称为只读的固定指针,其格式为:针,其格式为:const type*const x=地址表达式地址表达式;语句限定语句限定x,*x都为右值,因此都为右值,因此x+,x0+是错误的。是错误的。例如:例如:const int c=0;int j=0;const int *const x=&c;/x指向只读变量指向只读变量c,&c是是const int*型的地址型的地址const int *const y=&j;/y指向变量指向变量j,&j是是int*型的地址型的地址11六、二维数组六、二维数组 1.1.二维数组的定义二维数组的定义 一维数组是若干个同一类型有序变量的递增集合,由一维数组是若干个同一类型有序变量的递增集合,由一个数组名来描述,一个数组名来描述,r个一维数组需要个一维数组需要r个数组名来标识,当个数组名来标识,当r很大的时候,相应的定义语句等量增加。很大的时候,相应的定义语句等量增加。把把r个一维数组整合在一起形成二维数组,通过一个数个一维数组整合在一起形成二维数组,通过一个数组名来索引数组中的每一元素。组名来索引数组中的每一元素。12二维数组的定义格式为:二维数组的定义格式为:type d rc;类型类型 数组名数组名常数常数1常数常数2;常数常数1指出二维数组的行数指出二维数组的行数r,常数,常数2指出二维数组的指出二维数组的列数列数c。行数。行数r和列数和列数c是静态确定的正整数。是静态确定的正整数。例如例如:typedef int type;const int r=8;int c=6;type dr sizeof c;是允许的,是允许的,而而 typedef int type;int r=8,c=6;type drc;是不可以的。是不可以的。13 二维数组下标表达式中有二个下标如二维数组下标表达式中有二个下标如djk,第一个下标第一个下标j用于索引数组的行,第二个下标用于索引数组的行,第二个下标k指出相对于数组某行的指出相对于数组某行的列。列。二维数组一经定义就具有如下性质:二维数组一经定义就具有如下性质:a.行数行数r和列数和列数c一起确定数组的元素个数为一起确定数组的元素个数为 r*c。b.数组元素数组元素,二维数组第,二维数组第j+1行第行第k+1列的元素表示为列的元素表示为d j k,j合理的取值范围为合理的取值范围为 0r-1,k合理的取值范围为合理的取值范围为:0c-1。d j k 等价于访问指针形式等价于访问指针形式(*(*(d+j)+k),两者为,两者为type型左值,其作用相当于变量。数组元素占住内存的字节型左值,其作用相当于变量。数组元素占住内存的字节数为数为n=sizeof(type)=sizeof(d j k)。14 c.二维数组名具有两个信息,数组名二维数组名具有两个信息,数组名d代表数组的首地代表数组的首地址和大小。址和大小。d+j具有具有type(*)c型的属性,指向第型的属性,指向第j+1行即行即d+j 等价于等价于&dj。数组占住内存空间大小为:。数组占住内存空间大小为:sizeof(d)=r*c*n个字节。个字节。sizeof(d+j)=sizeof(type(*)c)=sizeof(type*)。sizeof(d)不等于不等于sizeof(d+0)。d.二维数组某行的首地址,二维数组某行的首地址,dj给出第给出第j+1行的首地行的首地址。可以认为二维数组的某行相当于一个一维数组,即址。可以认为二维数组的某行相当于一个一维数组,即dj的作用相当于一维数组名的作用。的作用相当于一维数组名的作用。d j 等价于等价于*(d+j),两者为,两者为type*型的右值,型的右值,d j+k或或*(d+j)+k 等价于等价于&djk。dj和和d+j具有相同的地址值但地具有相同的地址值但地址属性不同。址属性不同。r=sizeof(d)/sizeof(d0),sizeof(dj)=c*sizeof(type)。而而sizeof(dj+k)=sizeof(type*)。15 e.二维数组的元素在内存空间中是按照行的次序递增二维数组的元素在内存空间中是按照行的次序递增排列的,先排列第一行的每一个元素,再排列第二行的每一排列的,先排列第一行的每一个元素,再排列第二行的每一个元素;个元素;第一行最后一个元素第一行最后一个元素d0c-1紧邻第二行第一个元素紧邻第二行第一个元素d10;二维数组第一个元素为;二维数组第一个元素为d00,二维数组最后一个二维数组最后一个元素为元素为dr-1c-1。二维数组某行的首地址二维数组某行的首地址dj也是顺序连续递增的。每一也是顺序连续递增的。每一行可以当作一个一维数组。行可以当作一个一维数组。16 例如例如:数组定义语句数组定义语句short b34;double d43;就就定义两个二维数组,它们都有定义两个二维数组,它们都有12个数组元素。但个数组元素。但b占有占有 sizeof(short)*3*4=24 个字节的内存,个字节的内存,d占有占有 sizeof(double)*4*3=96 个字节的内存。个字节的内存。b,d都代表数组的首地址,都代表数组的首地址,d具有类型属性具有类型属性double(*)3,b是是short(*)4 类型属性的地址。类型属性的地址。定义语句中的定义语句中的3和和4用于界定数组的维数。用于界定数组的维数。b23,d32分别是这两个数组的最后一个元素,分别是这两个数组的最后一个元素,b34,d43是合法的表达式,但导致越界,其中的是合法的表达式,但导致越界,其中的3和和4是索引内存的下标。是索引内存的下标。定义语句分配唯一的一片内存,下标表达式定义语句分配唯一的一片内存,下标表达式ai,dij等用于访问或操作内存,编译器不检查下标是否越界。等用于访问或操作内存,编译器不检查下标是否越界。17 例如例如:数组数组int x24与与char z42在内存中的排放次在内存中的排放次序分别为:序分别为:x00,x01,x02,x03,x10,x11,x12,x13 z00,z01,z10,z11,z20,z21,z30,z31 从上可见元素从上可见元素z12与与z20 距离数组距离数组z的首地址具有的首地址具有相同的偏移,相同的偏移,x04将索引到元素将索引到元素x10。而而x14的索引方式导致越界。从上可见最后一个下标的索引方式导致越界。从上可见最后一个下标变化最快。变化最快。18 x i 是是int*型的右值地址,型的右值地址,z i 是是char*型的右值地址。型的右值地址。x i 和和z i 是不同类型的地址。是不同类型的地址。x i j 是是int型的左值,型的左值,z i j 是是char型的左值。型的左值。因此存在因此存在x i j =z j i 和和 z i j=x j i 形式形式的表达式,它们引起类型转换。的表达式,它们引起类型转换。不存在不存在x i =z j 和和z i=x j 形式的表达式,右值不形式的表达式,右值不能放在赋值符号的左边,并且不同类型的地址也不许隐含类能放在赋值符号的左边,并且不同类型的地址也不许隐含类型转换。型转换。19 例例 从二维数组中查找第一个出现的负数从二维数组中查找第一个出现的负数#include void main()const int n=3,m=2;int d n m;/定义二维数组定义二维数组 coutinput n*m integers:;int j;int I;for(i=0;in;i+)for(j=0;jd i j;for(i=0;in;i+)for(j=0;jm;j+)goto found;cout not found if(*(*(d+I)+j)0)!endl;goto end;20 found:coutd i j=dijendl;end:;某次运行的结果某次运行的结果:另一次运行的结果另一次运行的结果:input 6 integers:2 3-4 5 6 7 input 6 integers:2 3 4 5 6 7a02=-4 not found!说明:说明:在负数没有找到之前,双重循环正常运行,若循在负数没有找到之前,双重循环正常运行,若循环结束时未找到负数,则显示环结束时未找到负数,则显示not found!,然后执行,然后执行goto end语句,转至语句,转至end标号处。这里是一个空语句。标号处。这里是一个空语句。由此看出,使用由此看出,使用goto语句转移至某个没有语句的位置语句转移至某个没有语句的位置时,这个位置应放置一个空语句。这是空语句的一种用法。时,这个位置应放置一个空语句。这是空语句的一种用法。在循环中,若找到第一个出现的负数时,用在循环中,若找到第一个出现的负数时,用goto语句退出两语句退出两层循环,显示找到的负数。然后执行下面的空语句,进而结层循环,显示找到的负数。然后执行下面的空语句,进而结束程序的执行。束程序的执行。212.2.二维数组的初始化二维数组的初始化二维数组初始化定义语句的格式为:二维数组初始化定义语句的格式为:type drc=initialList;类型类型 数组名数组名常数常数1常数常数2=初始化列表初始化列表;在初始化列表的初值个数足以确定二维数组的大小时在初始化列表的初值个数足以确定二维数组的大小时可以省略地第一个常数的大小。即:可以省略地第一个常数的大小。即:type d c=initialList;类型类型 数组名数组名 常数常数2=初始化列表初始化列表;二维数组的初始化相当于多个一维数组的初始化的延拓,二维数组的初始化相当于多个一维数组的初始化的延拓,例如例如:int d24=1,2,3,4,5,6,7,8;22 可省去左边第一个定界的维数,但最右边定界的维数是可省去左边第一个定界的维数,但最右边定界的维数是必须的必须的:int d 4=1,2,3,4,5,6,7,8;也可以加上花括号也可以加上花括号:int d4=1,2,3,4,5,6,7,8;花括号的情形对于不完整的初始化格式是必须的花括号的情形对于不完整的初始化格式是必须的;int d 4=1,2,5,6,7;等价于等价于:int d24;d00=1;d01=2;d02=0;d03=0;d10=5;d11=6;d12=7;d13=0;23无花括号的情形:无花括号的情形:int d 4=1,2,5,6,7;对应:对应:int d 24;d00=1;d01=2;d02=5;d03=6;d10=7;d11=0;d12=0;d13=0;类似地:类似地:int d34=1,2,3;导致数组第一列的元素分别初始化为导致数组第一列的元素分别初始化为1,2,3,其余设置为,其余设置为0。类似地:类似地:int d34=1,2;导致数组第一列的元素分别初始化为导致数组第一列的元素分别初始化为1,2,0,其余设置为,其余设置为0。不可以写为:不可以写为:int d34=1,3;243.3.多维数组多维数组 多维数组的定义的格式为:多维数组的定义的格式为:类型类型 数组名数组名表达式表达式1 表达式表达式2 表达式表达式n;type array max1 max2 .maxn=初始化列表初始化列表;初始化语句定义多维数组时,可以不指定第一维的维数初始化语句定义多维数组时,可以不指定第一维的维数,但其余的维数是必须给定的:但其余的维数是必须给定的:type array max2.maxn=初始化列表初始化列表;n维数组的下标表达式有维数组的下标表达式有n个下标个下标,如下如下:array sub1 sub2.subn 下标运算符下标运算符 是从左向右结合的,最左下标表达式是从左向右结合的,最左下标表达式array sub1 首先求值首先求值,然后求下标表达然后求下标表达arraysub1sub2,依此类推。多维数组在内存单元中是连续的线性存放的。这依此类推。多维数组在内存单元中是连续的线性存放的。这称为多维空间到一维内存单元的映射。称为多维空间到一维内存单元的映射。C/C+对数组元素的安排按照第一个下标优先的顺序进行对数组元素的安排按照第一个下标优先的顺序进行.25 对于二维数组先存放第一行,接着存放第二行。对于三对于二维数组先存放第一行,接着存放第二行。对于三维数组先存放第一页,接着存放第二页。这也意味最后一个维数组先存放第一页,接着存放第二页。这也意味最后一个下标变化最快。下标变化最快。例如例如:对于三维数组对于三维数组 type smrc;/*m,r,c是预先静态给定的正数是预先静态给定的正数*/先存放第一页的先存放第一页的r*c个元素个元素s0rc;接着存放第二页的接着存放第二页的r*c个元素个元素s1rc。si的地位相当于二维数组名的地位相当于二维数组名d,对于,对于特定的一页,先存放该页二维数组第一行,接着存放第二特定的一页,先存放该页二维数组第一行,接着存放第二行。依此类推。行。依此类推。对于对于int s224在内存中的排放次序为:在内存中的排放次序为:s000,s001,s002,s003,s010,s011,s012,s013,s100,s101,s102,s103,s110,s111,s112,s1132627

    注意事项

    本文(const指针六二维数组.ppt)为本站会员(wuy****n92)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开