数组、指针与字符串.ppt
《数组、指针与字符串.ppt》由会员分享,可在线阅读,更多相关《数组、指针与字符串.ppt(42页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C+C+面向对象程序设计面向对象程序设计第四章第四章 数组、指针与字符串数组、指针与字符串陈春丽陈春丽第四章第四章 数组、指针与字符串数组、指针与字符串4.1 4.1 数组数组4.2 4.2 指针指针4.3 4.3 动态内存分配动态内存分配4.4 4.4 深拷贝与浅拷贝深拷贝与浅拷贝4.5 4.5 字符串字符串4.1 4.1 数组数组数组是具有一定顺序关系的若干相同类型变量的数组是具有一定顺序关系的若干相同类型变量的集合体,数组属于构造类型集合体,数组属于构造类型1 1)数组的长度是固定的)数组的长度是固定的2 2)数组元素在内存中顺次存放,它们的地址是连续的数组元素在内存中顺次存放,它们的地
2、址是连续的3 3)数组名是数组首元素的内存地址数组名是数组首元素的内存地址4 4)数组名是一个常量,不能被赋值数组名是一个常量,不能被赋值一维数组的声明一维数组的声明类型说明符类型说明符 数组名数组名 常量表达式常量表达式 ;例如:例如:int a10;int a10;表示表示 整型数组整型数组a a有有1010个元素个元素a0.a9a0.a9引用引用必须先声明,后使用。只能逐个引用数组元素,而不必须先声明,后使用。只能逐个引用数组元素,而不能一次引用整个数组能一次引用整个数组。例如:例如:a0=a5+a7-a2*3a0=a5+a7-a2*3例例4.14.1一维数组的声明与引用一维数组的声明与
3、引用#include#include using namespace std;using namespace std;int main()int main()int A10,B10;int A10,B10;int i;int i;for(i=0;i10;i+)for(i=0;i10;i+)Ai=i*2-1;Ai=i*2-1;B10-i-1=Ai;B10-i-1=Ai;for(i=0;i10;i+)for(i=0;i10;i+)coutcout AA i i =Ai;Ai;coutcout B B i i =BiBi endl;endl;二维数组的声明及引用二维数组的声明及引用声明声明类型说明符
4、类型说明符 数组名数组名 常量表达式常量表达式 常量表达式常量表达式;例如:例如:float a34;float a34;a0a00 a01 a02 a03a1a10 a11 a12 a13a2a20 a21 a22 a23a可以理解为:可以理解为:存储顺序存储顺序:按行存放,上例中数组按行存放,上例中数组a的存储顺序为:的存储顺序为:a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23引用引用 例如例如:b12=a23/2(下标不要越界)(下标不要越界)数组作为函数参数数组作为函数参数1 1)数组元素作实参,与单个变量一样数组元素作实参,与单个变量一
5、样2 2)数组名作参数,形、实参数都应是数组数组名作参数,形、实参数都应是数组名,类型要一样,传送的是数组首地址名,类型要一样,传送的是数组首地址对形参数组的改变会直接影响到实参数组对形参数组的改变会直接影响到实参数组例例4-24-2:使用数组名作为函数参数:使用数组名作为函数参数定义一个函数,计算定义一个函数,计算矩阵矩阵中中每一行的元素之和,每一行的元素之和,将和直接存放在每行的第一个元素中将和直接存放在每行的第一个元素中主函数测试主函数测试#include#include using namespace std;using namespace std;void RowSum(int A4
6、,int nrow)void RowSum(int A4,int nrow)int sum;int sum;for(int i=0;i nrow;i+)for(int i=0;i nrow;i+)sum=0;sum=0;for(int j=0;j 4;j+)for(int j=0;j 4;j+)sum+=Aij;sum+=Aij;cout Sum of row i cout Sum of row i is sum endl;is sum endl;Ai0=sum;Ai0=sum;int main()int main()int Table34=1,2,3,4,2,3,4,5,3,4,5,6;in
7、t Table34=1,2,3,4,2,3,4,5,3,4,5,6;for(int i=0;i 3;i+)for(int i=0;i 3;i+)for(int j=0;j 4;j+)for(int j=0;j 4;j+)cout Tableij endl;cout Tableij endl;RowSum(Table,3);RowSum(Table,3);for(int i=0;i 3;i+)for(int i=0;i 3;i+)cout Tablei0 cout Tablei0;运行结果:运行结果:1 2 3 41 2 3 42 3 4 52 3 4 53 4 5 63 4 5 6Sum of
8、 row 0 is 10Sum of row 0 is 10Sum of row 1 is 14Sum of row 1 is 14Sum of row 2 is 18Sum of row 2 is 1810 14 1810 14 184.2 4.2 指针指针内存空间的访问方式内存空间的访问方式通过变量名访问通过变量名访问通过地址访问通过地址访问地址运算符:地址运算符:&例:例:int var;int var;则则&var&var 表示变量表示变量varvar在内存中的起在内存中的起始地址始地址指针:内存地址,用于间接访问内存单元指针:内存地址,用于间接访问内存单元指针变量:用于存放地址的变量
9、指针变量:用于存放地址的变量声明声明:例:例:int i;int i;int*p int*p =&i;&i;指向整型变量的指针指向整型变量的指针内存用户数据区内存用户数据区变量变量 i i变量变量 j j变量变量p p3 36 620002000200020002004200430103010引用引用:例例1 1:i i =3;3;例例2 2:*p*p =3;3;指针变量的初始化指针变量的初始化语法形式语法形式存储类型存储类型 数据类型数据类型*指针名初始地址;指针名初始地址;例:例:int*pa=&a;int*pa=&a;注意事项注意事项用变量地址作为初值时,该变量必须在指针初用变量地址作为
10、初值时,该变量必须在指针初始化之前已说明过,且变量类型应与指针类型始化之前已说明过,且变量类型应与指针类型一致一致可以用一个已赋初值的指针去初始化另一可以用一个已赋初值的指针去初始化另一 个指个指针变量针变量不要用一个内部不要用一个内部 auto auto 变量去初始化变量去初始化 static static 指指针针指针变量的赋值运算指针变量的赋值运算指针名指针名=地址地址“地址地址”中存放的数据类型与指针类型必须相符中存放的数据类型与指针类型必须相符向指针变量赋的值必须是地址常量或变量,不向指针变量赋的值必须是地址常量或变量,不能是普通整数。但可以赋值为整数能是普通整数。但可以赋值为整数0
11、 0,表示空,表示空指针指针指针的类型是它所指向变量的类型,而不是指指针的类型是它所指向变量的类型,而不是指针本身数据值的类型,任何一个指针本身的数针本身数据值的类型,任何一个指针本身的数据值都是据值都是unsigned long intunsigned long int型型允许声明指向允许声明指向 void void 类型的指针。该指针可以类型的指针。该指针可以被赋予任何类型对象的地址被赋予任何类型对象的地址。例:例:void void*general;*general;例:指针的声明、赋值与使用例:指针的声明、赋值与使用#include#includeusing namespace std
12、;using namespace std;int main()int main()int int *i_pointer;*i_pointer;int int i;i;i_pointer=&i;i_pointer=&i;i=10;i=10;cout cout Output int i=Output int i=i i endl;endl;cout cout Output int pointer i=Output int pointer i=*i_pointer*i_pointer endl;endl;程序运行的结果是:程序运行的结果是:Output int i=10Output int i=10
13、Output int pointer i=10Output int pointer i=10指针变量的算术运算指针变量的算术运算指针与整数的加减运算指针与整数的加减运算指针指针p p加上或减去加上或减去n n,其意义,其意义是指针当前指向位置的前方是指针当前指向位置的前方或后方第或后方第n n个数据的地址个数据的地址这种运算的结果值取决于指这种运算的结果值取决于指针指向的数据类型针指向的数据类型指针加一,减一运算指针加一,减一运算指向下一个或前一个数据指向下一个或前一个数据例如:例如:y=*px+y=*px+相当于相当于 y=*(px+)y=*(px+)(*(*和和+优先级相同,自右向优先级相
14、同,自右向左运算左运算)pa-2pa-2pa-1pa-1pa+1pa+1pa+2pa+2pa+3pa+3*(pa-2)*(pa-2)*pa*pa*(pa+1)*(pa+1)*(pa+2)*(pa+2)*(pa+3)*(pa+3)*(pa-1)*(pa-1)short*pashort*papb-1pb-1pbpbpb+1pb+1pb+2pb+2*(pb-1)*(pb-1)*pb*pb*(pb+1)*(pb+1)*(pb+2)*(pb+2)long*pblong*pb指针变量的关系运算指针变量的关系运算关系运算关系运算指向相同类型数据的指针之间可以进行各种关指向相同类型数据的指针之间可以进行各种关
15、系运算。系运算。指向不同数据类型的指针,以及指针与一般整指向不同数据类型的指针,以及指针与一般整数变量之间的关系运算是无意义的。数变量之间的关系运算是无意义的。指针可以和零之间进行等于或不等于的关系运指针可以和零之间进行等于或不等于的关系运算。例如:算。例如:p=0p=0或或p!=0p!=0赋值运算赋值运算向指针变量赋的值必须是地址常量或变量,不向指针变量赋的值必须是地址常量或变量,不能是普通整数。但可以赋值为整数能是普通整数。但可以赋值为整数0 0,表示空,表示空指针指针指向数组元素的指针指向数组元素的指针声明与赋值声明与赋值例:例:int a10,*pa;int a10,*pa;pa=&a
16、0;pa=&a0;或或 pa=a;pa=a;通过指针引用数组元素通过指针引用数组元素经过上述声明及赋值后:经过上述声明及赋值后:*pa*pa就是就是a0a0,*(pa+1)*(pa+1)就是就是a1a1,.,*(pa+i)*(pa+i)就是就是ai.ai.ai,*(pa+i),*(a+i),paiai,*(pa+i),*(a+i),pai都是等效的。都是等效的。不能写不能写 a+a+,因为,因为a a是数组首地址是常量是数组首地址是常量设有一个设有一个intint型数组型数组a a,有,有1010个元素。用三种个元素。用三种方法输出各元素:方法输出各元素:(1)(1)使用数组名和下标使用数组名
17、和下标;(2);(2)使用数组名和指针运算使用数组名和指针运算;(3);(3)使用指针变使用指针变量量使用数组名和下标使用数组名和下标int main()int main()int a10;int a10;int i;int i;for(i=0;i10;i+)for(i=0;iai;cinai;coutendl;coutendl;for(i=0;i10;i+)for(i=0;i10;i+)coutai;coutai;使用数组名和指使用数组名和指针运算针运算int main()int main()int a10;int a10;int i;int i;for(i=0;i10;i+)for(i=0
18、;iai;cinai;coutendl;coutendl;for(i=0;i10;i+)for(i=0;i10;i+)cout*(a+i);cout*(a+i);使用指针变量使用指针变量int main()int main()int a10;int a10;int*p,i int*p,i;for(i=0;i10;i+)for(i=0;iai;cinai;coutendl;coutendl;for(p=a;p(a+10);p+)for(p=a;p(a+10);p+)cout*p;cout*p;指针数组指针数组数组的元素是指针型数组的元素是指针型例:例:Point *pa2;Point *pa2;
19、数数组组papa由由pa0,pa1pa0,pa1两两个指针组成个指针组成例:利用指针数组存例:利用指针数组存放单位矩阵放单位矩阵#include#include using namespace std;using namespace std;int main()int main()int line1=1,0,0;int line1=1,0,0;int line2=0,1,0;int line2=0,1,0;int line3=0,0,1;int line3=0,0,1;int*p_line3;int*p_line3;p_line0=line1;p_line0=line1;p_line1=lin
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数组 指针 字符串
限制150内