《数组指针与字符串》PPT课件.ppt_第1页
《数组指针与字符串》PPT课件.ppt_第2页
《数组指针与字符串》PPT课件.ppt_第3页
《数组指针与字符串》PPT课件.ppt_第4页
《数组指针与字符串》PPT课件.ppt_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第六章 数组指针与字符串,数组 指针 动态内存分配 字符串,数组的概念,数组是具有一定顺序关系的若干相同类型变量的集合体,组成数组的变量称为该数组的元素。 每个元素有n个下标的数组称为n维数组。 数组属于自定义数据类型,使用之前首先要进行类型声明。,说明: 1. 数组元素在内存中顺次存放,它们的地址是连续的。 2. 数组名字是数组首元素的内存地址。 3. 数组名是一个常量,不能被赋值。,数组,在声明数组时对数组元素赋以初值。 例如:int a10=0,1,2,3,4,5,6,7,8,9; 可以只给一部分元素赋初值。 例如:int a10=0,1,2,3,4; 在对全部数组元素赋初值时,可以不指定数组长度。 例如:int a=1,2,3,4,5,一维数组声明形式: 数组类型 标识符常量表达式,二维数组的声明及使用,数据类型 标识符常量表达式1常量表达式2 ; 例: int a53; 表示a为整型二维数组,其中第一维有5个下标(04),第二维有3个下标(02),数组的元素个数为15,可以用于存放5行3列的整型数据表格。,存储顺序 按行存放,上例中数组a的存储顺序为:,二维数组的声明 类型说明符 数组名常量表达式常量表达式 例如:float a34;,使用 例如:b12=a23/2,下标不要越界,二维数组的声明及使用,二维数组的初始化,将所有数据写在一个内,按顺序赋值 例如:int a34=1,2,3,4,5,6,7,8,9,10,11,12; 分行给二维数组赋初值 例如:int a34 =1,2,3,4,5,6,7,8,9,10,11,12; 可以对部分元素赋初值 例如:int a34=1,0,6,0,0,11;,2.数组作为函数参数,数组元素作实参,与单个变量一样。 数组名作参数,形、实参数都应是数组名,类型要一样,传送的是数组首地址。对形参数组的改变会直接影响到实参数组。,数组元素和数组名都可作为函数参数来进行数据传递和共享。,#include void RowSum(int A 4,int nrow) /算A每行元素之和,nrow为行数 for(int i=0;inrow;i+) for(int j=1;j4;j+) Ai0+=Aij; void main() int Table34=1,2,3,4,2,3,4,5,3,4,5,6; for(int i=0;i3;i+) for(int j=0;j4;j+) coutTableij“ “; coutendl; RowSum(Table,3); /数组名实参,传递首地址 for(i=0;i3;i+) couti“:”Tablei0endl; ,1 2 3 4 2 3 4 5 3 4 5 6 0:10 1:14 2:18,例 计算数组每行元素之和,3.对象数组,声明: 下标表达式. 访问:数组名下标.公有成员名 例如: TDate dates7; TDate date35;,对象数组初始化,数组中每一个元素对象被创建时,系统都会调用类构造函数初始化该对象。 通过初始化列表赋值。 例:point a2=Point(1,2),Point(3,4); 如果没有为数组元素指定初始值,数组元素便使用默认值初始化(调用默认构造函数)。 例: Point a2=Point(1,2);,对象数组赋赋值 a0=Point (1,2); a1= Point (3,4);,当数组中每一个元素对象被删除时,系统都要调用一次析构函数来完成扫尾工作。,对象数组例,/Point.h #ifndef _POINT_H #define _POINT_H class Point public: Point(); Point(int x,int y); /构造函数重载 Point(); void move(int newX,int newY); int GetX() const return x; int GetY() const return y; static void showCount() cout“X:“x“Y:“yendl; private: int x,y; ; #endif,对象数组例,#include“Point.h“ Point:Point() x=0; y=0; cout“Default Constructor called.“endl; Point:Point(int x,int y):x(x),y(y) cout“Constructor called.“endl; Point:Point() cout“Destructor called.“endl; void Point:move(int newX,int newY) cout“Moving point to(“newX“,“newY“)“endl x=newX; y=newY;,对象数组例,#include “Point.h “ #include using namespace std; void main() cout“Entering main.“endl; Point a2; /调用默认构造函数置空 for(int i=0;i2;i+) ai.move(i+10,i+20); cout“Exiting main.“endl; ,Entering main. Default Constructor called. Default Constructor called. Moving point to (10,20) Moving point to (11,21) Exiting main. Destructor called. Destructor called.,指针概念,内存空间访问方式:一是通过变量名,二是通过地址 指针变量:存放内存单元地址的变量 指针声明: 数据类型 *标识符,声明 例:int i; int *ptr= 指向整型变量的指针,指针:内存地址,用于 间接访问内存单元 指针变量:用于存放地址的变量,引用 例1:i=3; 例2:*ptr=3;,指针变量的初始化,语法形式 存储类型 数据类型 *指针名初始地址; 例:int *pa= 注意事项 用变量地址作为初值时,该变量必须在指针初始化之前已说明过,且变量类型应与指针类型一致。 可以用一个已赋初值的指针去初始化另一 个指针变量。,运算符*和&:,int c; int *p=/声明并初始化float指针,指针变量的赋值运算,指针名=地址 “地址”中存放的数据类型与指针类型必须相符。 向指针变量赋的值必须是地址常量或变量,不能是普通整数。但可以赋值为整数0,表示空指针。 指针的类型是它所指向变量的类型,而不是指针本身数据值的类型,任何一个指针本身的数据值都是unsigned long int型。 允许声明指向 void 类型的指针。该指针可以被赋予任何类型对象的地址。 例: void *pv;,例 指针的定义、赋值与使用,#include using namespace std; void main() int *ptr; /声明int型指针ptr int i; /声明int型数i ptr= /输出int型指针所指地址的内容 ,指向常量的指针: 例:char a=”abc”; char b=“cde“; const char *name1=a; name1=b; /正确,name1本身值可变 *name1=1; /错,不能通过name1改变所指对象 常量指针: 例: char a=”abc”; char b=“cde“; char *const name2=a; *name2=1; /正确,name2指向的值可变 name2=b; /错,name2是常量指针,本身值不能变 void类型指针: 例:void a; /错,不能声明void型变量 void *pv; /可以声明void型指针 int *pt,i; pv= /强制类型转换,指针变量的算术运算,指针与整数的加减运算 指针p加上或减去n,其意义是指针当前指向位置的后方或前方第n个数据的地址。 这种运算的结果值取决于指针指向的数据类型。 指针加一,减一运算 指向下一个或前一个数据。,指针变量的关系运算,关系运算 指向相同类型数据的指针之间可以进行各种关系运算。 指向不同数据类型的指针,以及指针与一般整数变量之间的关系运算是无意义的。 指针可以和零之间进行等于或不等于的关系运算。例如:p=0或p!=0 赋值运算 向指针变量赋的值必须是地址常量或变量,不能是普通整数。但可以赋值为整数0,表示空指针。,用指针处理数组元素,例:int array5; int *p; p=array; 则: array,&array0,p相同,均指向数组首地址, array为常量指针,p为指针 arrayi *(array+i) *(p+i) pi 表示第i个数组元素,例 使用数组名指针运算,void main() int a10; int i; for(i=0; iai; coutendl; for(i=0; i10; i+) coutai; ,*(a+i);,使用指针变量,void main() int a10; int *p,i; for(i=0; iai; coutendl; for(p=a; p(a+10); p+) cout*p; ,指针数组,一维指针数组格式: 类型名 *数组名下标表达式; 例: int *pa3; TDate *pb4; /由pb0,pb1, pb2, pb3四个指针组成 说明: 1)后条语句声明了一个TDate类的指针数组,有 4个元素,每个元素都是指向TDate型数据的 指针 ; 2)指针数组要先赋值,再引用。,例 指针数组,#include void main() int line1 = 1,0,0; line2 = 0,1,0; line3 = 0,0,1; int *pLine3=line1, line2, line3; cout“Matrix test: “endl; for(int i=0;i3;i+) for(int j=0;j3;j+) coutpLineij“ “; coutendl; ,输出: 1 0 0 0 1 0 0 0 1,例 二维数组,#include using namespace std; void main() int array223=11,12,13,21,22,23; for(int i=0;i2;i+) for(int j=0;j3;j+) cout*(*(array2+i)+j)“ “; /或者 coutarray2ij“ “; coutendl; ,例 指针数组,#include class A public: A(int i=0,int j=0) a=i;b=j; void Print() coutPrint(); ,输出: 5,7 0,0 7,8,指向数组的指针,一维格式: 类型名 (*指针名)下标表达式; 例: int a4 = 1,2,3,4; int (*pa)3; pa= 说明:后条语句声明了一个指向类TDate数组的指针变量pb,有4个元素, 每个元素为TDate型,pb为行指针,不能指向一维数组中第j个元素。,例 指向数组的指针,#include void main() int a34=1,3,5,7,9,11,13,15,17,19,21,23; int (*p)4,i,j; p=a; coutij; cout“a“i“,“j“=“*(*(p+i)+j); ,结果: i,j=1 3 a1,3=15,指针作为函数参数,指针为形参时的作用: 1)使实参与形参指针指向共同的内存空间,达到数据双向传递的目的;C+中由引用实现该目的; 2)减少函数调用时数据传递的开销; 3)通过指向函数的指针传递函数代码的首地址。,例 指针作为函数参数,例 读入三个浮点数,将整数、小数部分分别输出 #include void splitfloat(float x,int *intpart,float *fracpart) *intpart=int(x); *fracpart=x-*intpart; void main() int i,n; float x,f; coutx; splitfloat(x, ,结果: Enter 3 float point numbers: 4.7 Integer Part=4 Fraction Part=0.7 8.913 Integer Part=8 Fraction Part=0.913 -4.7518 Integer Part=-4 Fraction Part=-0.7518,例: 输出数组元素的内容和地址,#include void Array_Ptr(long *P, int n) int i; cout“In func, address of array is “ unsigned long(P)endl; cout“Accessing array using pointers“ endl; for (i = 0; i n; i+) cout“ Address for index “i“ is “ unsigned long(P+i); cout“ Value is “*(P+i)endl; ,void main() long list5=50, 60, 70, 80, 90; cout“In main, address of array is “ unsigned long(list)endl; coutendl; Array_Ptr(list,5);,结果: In main, address of array is 1245036 In func, address of array is 1245036 Accessing array using pointers Address for index 0 is 1245036 Value is 50 Address for index 1 is 1245040 Value is 60 Address for index 2 is 1245044 Value is 70 Address for index 3 is 1245048 Value is 80 Address for index 4 is 1245052 Value is 90 Press any key to continue,指针型函数和指向函数的指针,1)指针型函数 定义: 数据类型 *函数名(形参表) 函数体 说明:当一个函数的返回值是指针类型,该函数就是指针型函数 用途:在函数结束时返回大量数据到主调函数中.,2)指向函数的指针 定义: 数据类型 (*函数指针名)(形参表) 赋值: 函数指针名=函数名; 说明:函数指针是用于存放函数代码首地址的变量. 用途:用指向函数的指针来调用函数(同函数名调用函数一样) 函数名表示函数代码在内存中的起始地址。,例 函数指针 #include void printStuff(float) cout“This is the print stuff function.n“; void printMessage(float data) cout“The data to be listed is “dataendl; const float PI=3,14159f; void main() void (*functionPointer)(float); printStuff(PI); functionPointer=printStuff; functionPointer(PI); printMessage(PI); functionPointer=printMessage; functionPointer(PI); ,This is the print stuff function. This is the print stuff function. The data to be listed is 3.14159 The data to be listed is 3.14159,对象指针,1)对象指针一般概念 声明: 类名 *对象指针名; Point p1, *ptr; ptr = 访问: 对象指针名-成员名; /利用对象指针访问对象成员,2)this指针 该指针是隐含于每一个类的成员函数中的特殊指针; 用于指向正在被成员函数操作的对象; this-x指明成员函数当前所操作数据所属的对象; *this标识正在调用该成员函数的对象;,指向类的非静态成员的指针,(1)声明指向数据成员的指针: 类型名 类名:*指针名; int A:*p1; 对数据成员指针赋值: 指针名=,A a, *p2;,(2)声明指向成员函数的指针: 类型名 (类名:*指针名)(参数表); int (A:*p3)( ); 对成员函数指针赋值: 指针名=,例 访问对象的公有成员函数的不同方式,class Point public: Point(int a,int b)x=a;y=b; int GetX()return x; private: int x,y; ; void main() Point a(4,5) , *p1= /使用对象指针访问成员函数 ,指向类的静态成员的指针,例 类的静态成员可以用普通的指针来指向和访问 class Point public: static int countP; /静态数据成员 static void GetC( ) coutcountPendl; /静态成员函数 ; int Point:countP=10; void main( ) int *count = /直接用指针访问静态成员函数 ,动态内存分配,1. 堆对象 在程序运行过程中根据需要可以随时建立或删除的对象; 2. 堆对象运算符: new、delete 3. new运算符 动态内存分配或称动态创建堆对象。 格式: new 类型名(初始值列表) 例: int *pi; pi = new int(2); new运算符返回一个与new所分配对象类型相匹配的指针,如果new运算符不能分配到所需要的内存,将返回0,这时为空指针;,动态内存分配,用new运算符创建数组的语法形式: new 类型名下标表达式; /一维数组 例:A *ptr ; /建立对象指针 ptr=new A5; /动态分配用于存放类A类型数据的空间,A有5个数组元素,将首地址赋给指针ptr. 注意:1)使用new创建对象数组或一般数组时,不能为该数组指定初始值,其初始值为缺省值; 2)使用new创建对象数组时,类中必须说明缺省构造函数;,动态内存分配,delete运算符 作用:删除用new创建的对象或一般类型的指针. 格式: delete 指针名 例: A *ptr; ptr=new A(5,6); delete ptr; 删除对象数组格式: delete 指针名 例: A *ptr; ptr=new A5; delete ptr;,例 动态内存分配,#include class Point public: Point( ): x(0), y(0) cout“Default Constructor called.“endl; Point(int x,int y): x(x),y(y) cout“Constructor called.“endl; Point( ) cout“Destructor called.“endl; void move(int newX,int newY) x=newX;y=newY; private: int x,y; ;,结果: Step One: Default Constructor called. Destructor called. Step Two: Constructor called. Destructor called. Step Three: Default Constructor called. Default Constructor called. Destructor called. Destructor called. /用new创建的动态对象,只能用delete释放. /可以用动态数组类解决动态数组的自动建立和删除,void main() cout“Step One:“endl; Point *ptr1=new Point; /动态创建对象,无初值,调用默认构造函数 delete ptr1; /删除对象,自动调用析构函数 cout“Step Two:“endl; ptr1=new Point(1,2); /动态创建对象并给初值,调用有形参构造函数 delete ptr1; /删除对象,自动调用析构函数 cout“Step Three:“endl; ptr1=new Point2; /动态创建对象数组,调用默认构造函数 ptr10.move(5,10); /通过指针访问数组元素的成员 ptr11.move(15,20); delete ptr1; ,例 动态内存分配,动态数组类,将数组的建立和删除过程封装起来,形成一个动态数组类,例 由动态数组类完成Point类动态数组的创建和释放 class Point ; class ArrayOfPoint public: Ar

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论