const指针六二维数组.ppt
《const指针六二维数组.ppt》由会员分享,可在线阅读,更多相关《const指针六二维数组.ppt(27页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、五、五、const指针指针 六、二维数组六、二维数组 1五、五、const指针指针 普通指针是没有普通指针是没有const约束的指针,这样的指针本身既约束的指针,这样的指针本身既可以变动,其指向的内存单元也可更新。可以变动,其指向的内存单元也可更新。普通指针普通指针p进行两种运算:进行两种运算:一种是指针的加减寻址运算,如一种是指针的加减寻址运算,如p=&a i,p+,p+=I等,这种运算改变指针本身。等,这种运算改变指针本身。另一种是访问指针运算,如另一种是访问指针运算,如*p=pj,*(p+j)=p0,这,这种种运算读写内存,可改变间接变量而不改变指针。运算读写内存,可改变间接变量而不改变
2、指针。为了清晰界定指针的不同运算,引进为了清晰界定指针的不同运算,引进const指针。指针指针。指针与与const组合派生出三种意义不同的形式。组合派生出三种意义不同的形式。2 第一种形式定义的指针称为只读指针。第一种形式定义的指针称为只读指针。形式为:形式为:const type *r;const 类名类名*只读指针;只读指针;const type *r=地址表达式地址表达式;const 类名类名*只读指针只读指针=数据区的地址;数据区的地址;第一种形式可以不必同时进行初始化,即可以先定义第一种形式可以不必同时进行初始化,即可以先定义r,然后再将该指针指向某个同类型的变量或数组。,然后再将该
3、指针指向某个同类型的变量或数组。只读指针可以在一片只读或非只读的数据区移动,以便只读指针可以在一片只读或非只读的数据区移动,以便将数据只读地复制到其它位置。只读指针既可指向只读区也将数据只读地复制到其它位置。只读指针既可指向只读区也可指向变量或左值区。定义中的关键字可指向变量或左值区。定义中的关键字const限定限定*r为右为右值,具体地说只读指针值,具体地说只读指针r是左值指针,间接变量是左值指针,间接变量*(r+i)或或ri约约束为右值表达式。束为右值表达式。3 第二种形式定义的指针称为固定指针或右值指针。第二第二种形式定义的指针称为固定指针或右值指针。第二种形式为:种形式为:type *
4、const s=左值区的地址左值区的地址;类名类名*const 固定指针固定指针=非只读区的地址;非只读区的地址;第二种形式必须同时用变量或左值的地址进行初始化,第二种形式必须同时用变量或左值的地址进行初始化,除非作为形参。定义中的关键字除非作为形参。定义中的关键字const冻结指针冻结指针s为右值,为右值,*s或或si是左值。是左值。一维数组名一维数组名a就是一个这样的右值地址,就是一个这样的右值地址,r=a是可以是可以的,的,a=r是错误的,这确保数组元素总是可以通过是错误的,这确保数组元素总是可以通过a来索引。来索引。右值指针可以用来接受右值指针可以用来接受new运算符申请动态自由空间成
5、运算符申请动态自由空间成功后的结果值,以避免对堆指针加减的误操作。功后的结果值,以避免对堆指针加减的误操作。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+;con
6、st 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、单元。写它指向的存储单元。固定指针本身是不变的,但固定指针指向的存储单元允固定指针本身是不变的,但固定指针指向的存储单元允许更新。许更新。固定指针只读指针都可以指向变量,固定指针和普通指固定指针只读指针都可以指向变量,固定指针和普通指针不指向只读数据区而仅指向左值数据区。针不指向只读数据区而仅指向左值数据区。只读指针本身是可变的,只读指针的间接访问不得改写只读指针本身是可变的,只读指针的间接访问不得改写它指向的存储单元。它指向的存储单元。固定指针本身是不变的,但固定指针指向的存储单元允固定指针本身是不变的,但固定指针指向的存储单元允许更新。许更新。固定指针只读指针都可以指向变量,固定指针和普通
8、指固定指针只读指针都可以指向变量,固定指针和普通指针不指向只读数据区而仅指向左值数据区。针不指向只读数据区而仅指向左值数据区。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
9、 固定指针固定指针s指向只读数组首元素指向只读数组首元素,*s可为左值,间接地可为左值,间接地导导致致c0为左值,但这与只读数组的定义矛盾;类似地普通指为左值,但这与只读数组的定义矛盾;类似地普通指针针p不指向只读数组。不可以对只读指针进行左值访问:不指向只读数组。不可以对只读指针进行左值访问:const char*r=abc;/字符串安排在只读数据区,其首地址具有字符串安排在只读数据区,其首地址具有char*属性属性 *r=m;/错误,错误,*r是右值表达式是右值表达式左值区可作为右值区访问。左值区可作为右值区访问。从从int*型转换到型转换到const int*型是默许的。但是反之不型是默
10、许的。但是反之不然,即不将然,即不将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,
11、%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.二维数组的
12、定义二维数组的定义 一维数组是若干个同一类型有序变量的递增集合,由一维数组是若干个同一类型有序变量的递增集合,由一个数组名来描述,一个数组名来描述,r个一维数组需要个一维数组需要r个数组名来标识,当个数组名来标识,当r很大的时候,相应的定义语句等量增加。很大的时候,相应的定义语句等量增加。把把r个一维数组整合在一起形成二维数组,通过一个数个一维数组整合在一起形成二维数组,通过一个数组名来索引数组中的每一元素。组名来索引数组中的每一元素。12二维数组的定义格式为:二维数组的定义格式为:type d rc;类型类型 数组名数组名常数常数1常数常数2;常数常数1指出二维数组的行数指出二维数组的行数r
13、,常数,常数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指出相对于数组某行的指出相对于数组某行的列。列。二维数组一经定义就具有如下
14、性质:二维数组一经定义就具有如下性质: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.二维数组名具
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- const 指针 二维 数组
限制150内