收藏 分销(赏)

面向对象课件(第六章)05.ppt

上传人:仙人****88 文档编号:13372064 上传时间:2026-03-09 格式:PPT 页数:81 大小:419KB 下载积分:10 金币
下载 相关 举报
面向对象课件(第六章)05.ppt_第1页
第1页 / 共81页
面向对象课件(第六章)05.ppt_第2页
第2页 / 共81页


点击查看更多>>
资源描述
单击此处编辑母版标题样式,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第六章复合数据类型,第六章 复合数据类型,6.1,指针类型,6.2,数组类型,6.3,字符串,6.4,指向对象的指针,6.5,指向函数的指针,6.1 指针类型,指针概念,指针的定义,指针运算,引用类型,6.1 指针类型,指针概念,指针:是一种数据类型,指针变量:具有指针类型的变量,指针变量的值:某变量的地址值,指针变量的类型:它所指向的变量的类型,指针可以指向任何数据类型,可以指向数组、指向函数、指向文件、指向指针(多级指针),6.1 指针类型,如:,int age=20;,int*ptr;,ptr=,内存,内存地址,20,324848,324848,age,ptr,365626,6.1 指针类型,指针本身也是一个变量,ptr=,ptr=,2df4,(2df8),156,99,1234,1238,123c,2df0,2df4,2df8,i=156,j=99,ptr=2df4,ptr=,2df8,指针变量的值可以改变,6.1 指针类型,指针的定义,必须“先声明,后使用”,int*ip;,/定义一个指向整型数的指针ip,float*fp;,/定义一个指向浮点数的指针fp,char*cp;,/定义一个指向字符型的指针cp,int*(ipa)10;,/指向整型数组的指针,int*ipp;,/指向指针的指针,6.1 指针类型,指针定义方法,在类型名后或指针变量名前加“*”,如:定义一个指针变量ip,(可用以下格式),int *ip;,int*ip;,/在一条语句中定义的多个变量都,必须是指针,6.1 指针类型,指针本身只有一种,各种类型指针变量的内存长度一样,(32位机,占4个字节),可以用sizeof()函数进行测试:,即:sizeof(int*)=sizeof(float*),=sizeof(char*)=sizeof(char*),=,6.1 指针类型,指针的初始化,(可在指针定义时初始化),例:,int i1,i2;,int ia10;,int*p1=,/用变量的地址初始化指针,int*p2=p1;,/用另一个指针初始化指针,int*p3=ia;,/用数组名初始化指针,6.1 指针类型,指针运算,指针变量的两个运算符:“,*,”和“,&,”,“,*,”取出指针所指的变量地址中的值,“,&,”取出操作数的地址,指针是一种特殊的变量,指针运算一般包括指针,赋值运算,和指针,加减运算,6.1 指针类型,指针赋值,例:,int i1,ia10;,int*p1,p2,p3;,p1=,/可以用变量的地址赋值,p2=p1;,/可以用另一个指针赋值,p3=ia;,/可以用数组名赋值,p3=NULL;,/空指针,不指向任何空间,6.1 指针类型,例:,int i,j;,int*p=,*p=45;/等同于i=45,j=*p;/等同于j=i,p=/p指向j,*p=189;/等同于j=189,6.1 指针类型,“*”的作用(两种),-指针定义时,“*”表示定义的是指针,-指针运算时,“*”表示指针所指向的内存单,元中的值,注:,*p,能否作为左值与它所指向的空间能否作,为左值相关,例:,int i;例:const int x=5;,int*p=,*p=45;*q=89;,6.1 指针类型,“&”的作用:取地址,(只能用于可以取出地址的表达式),例:,p=,/error!常数没有固定地址,p=ar+3;,/允许,ar是数组名,p=,/i,j都是合法地址,但相加不一定合法,p=,/允许,但较危险,地址加常量不一,定是地址,6.1 指针类型,指针运算(加运算),例:,int*p;,p=p+1;,注:不是地址加1,而是加一个整型数,6.1 指针类型,指针运算(减运算),在一定条件下,两个指针可以相减,例:指向同一个数组不同元素的两个指针相减,,其差是这两个指针之间相隔元素的个数,如:一个字符串,一个指针指向首字符,另一,个指针指向尾字符,两指针之差就是字符,串长度,6.1 指针类型,指针运算,在一定条件下,两个指针可以相比较,例:指向同一个数组的两个指针可以比较,,当两指针相等时,说明这两个指针指,向同一个数组元素,6.1 指针类型,引用类型,:在某个数据类型后加“&”,例:int i=1;,int /int&是整型int的引用,类型,引用类型的变量(ir)并不是真创建的新变量,而是作为另一个变量(i)的别名,引用类型的变量必须初始化,6.1 指针类型,int i=1;,int,引用,ir,作为,i,的别名后,对,ir,的操作就相当于作用在变量,i,上,如:,ir=10;,/相当于i=10;,cout,/相当于输出i的地址,6.1 指针类型,引用类型的作用,用来作函数的参数或返回值,(按引用调用的参数传递方式),例:交换两个整数,void swap(int&x,int&y),int temp;,temp=x;,x=y;,y=temp;,6.1 指针类型,void main(),int i,j;,coutij;,cout“Before swapping:”i,jendl;,swap(i,j);,cout“After swapping:”i,jendl;,/形参x,y分别是实参i,j的别名,对形参的修改即对实参的修改,6.1 指针类型,按引用调用的好处,-比按值调用的效率高,不用复制实参的副本,-可返回多个值,相当于对实参操作,6.2 数组类型,数组定义,数组元素的访问,数组元素的初始化,数组作为函数参数,多维数组,指针与数组,指针数组与数组指针,6.2 数组类型,数组定义,数组元素的类型可以是任何数据类型,char ca10;,/字符数组表示学生,int ia10;,/整数数组表示年龄,float fa10;,/浮点数组表示成绩,double da10;,/双精度数组,int ia1010;,/数组的数组二维数组,PEOPLE ra10;,/对象数组,int*pa10;,/指针数组,6.2 数组类型,数组元素的个数是整型常量表达式,例:,const int array_size;,char ca0+2;,int iaarray_size;,float faarray_size*2;,6.2 数组类型,和()的含义不同,int a5;,/定义一个具有5个元素的数组,int a(5);,/定义一个初始值为5的整型变量,6.2 数组类型,数组表示内存中一块连续的区域,long int a5;,a,0,a,1,a,2,a,3,a,4,a,a,6.2 数组类型,数组元素的类型决定了每次偏移的大小,a,0,a,1,a,2,a,3,a,4,a,b,0,b,1,b,2,b,3,b,4,b,long a5;,short b5;,a,b,每个元素占4个字节,每个元素占2个字节,6.2 数组类型,数组元素的访问,可以作为左值,int a10;,for(int i=0;i10;i+),ai=i*3;,可以作为右值,int a10;,for(int i=0;i10;i+),coutai;,下标不能越界!,数组元素的下标从0开始,6.2 数组类型,数组元素的初始化,int ia10;,int ia10=0,1,2,3,4,5,6,7,8,9;,int ia10=0,1,2,3;,int ia=0,1,2,3,4,5,6,7,8,9;,int ia10=0,1,2,3,4,5,6,7,8,9,10,11;,int ia10=0,1,2,3,;,int ia10=;,int ia;,6.2 数组类型,数组大小的确定,用,sizeof(),可返回整个数组所占空间,int ia=45,32,58,99,18;,int len;,len=sizeof(ia)/sizeof(int);/可得到数组长度,6.2 数组类型,数组使用规则,使用数组的方式是数组名加下标,数组下标是整型常量表达式,数组下标从0开始,数组下标不能越界,6.2 数组类型,数组作为函数参数,int ia5;,/在main()中,func(ia);,/函数调用,void func(int iarray),ia,0,ia,1,ia,2,ia,3,ia,4,ia,程序代码,程序数据,堆,栈,内存,ia,的地址,数组是按地址传递,6.2 数组类型,数组作为函数参数,一般要把数组的大小传递给函数,int average(int ia,int len,),int sum=0;,for(int i=0;ilen;i+),sum+=iai;,return sum/len;,6.2 数组类型,int average(int ia),int len=sizeof(ia)/sizeof(int);,int sum=0;,for(int i=0;ilen;i+),sum+=iai;,return sum/len;,/数组作函数参数传递时会丢失数组的信息,ia,是一个地址,(指针),占4个字节,/len 是错误的!,6.2 数组类型,书上第155页 冒泡程序,6.2 数组类型,多维数组,以数组作为数组的元素类型,char name1020;,/二维数组,int iarray101010;,/三维数组,6.2 数组类型,多维数组的理解,int a,44,;,a00,a01,a02,a03,a10,a11,a12,a13,a20,a21,a22,a23,a30,a31,a32,a33,a00,a01,a02,a03,a10,a11,a12,a13,a20,a21,a22,a23,a30,a31,a32,a33,a,0,a,1,a,2,a,3,6.2 数组类型,多维数组的初始化,按行进行初始化,int b23=1,2,3,4,5,6;,int b23=1,2,3,4,5,6;,int b23=1,2,4,5,6;,int b23=1,2,3;,int b 3=1,2,3,4,5,6,7,8;,注:第二维的大小不能省略,例:int b=1,2,3,4,5,6,7,8;,1 2 -,4 5 6,1 2 3,-,1 2 3,4 5 6,7 8 -,6.2 数组类型,多维数组作为函数参数,也是按地址传递,只能省略第一维的大小,后面的维数不能省略,可以降维处理,int a1010 func(&a00,10*10),6.2 数组类型,例:,void func(int a10);,void main(),int a1010;,func(a);,void func(int a10),coutsizeof(a)/sizeof(int);,/结果为1,coutsizeof(,a0,)/sizeof(int);,/结果为10,6.2 数组类型,指针与数组,数组名实际上是一个指针,int ia5;,int*p=ia;,或,int ia5,*p;,p=,p=ia;,ia,0,ia,1,ia,2,ia,3,ia,4,ia,p,等价,6.2 数组类型,下面的式子等价,pia,*pia0 *ia p0,*(p+i)iai*(ia+i)pi,p+iia+i&iai&pi,6.2 数组类型,遍历数组,for(int i=0;i10;i+),coutiai;,for(int i=0;i10;i+),cout*p+;,/或pi或*(p+i)或*(ia+i),6.2 数组类型,数组与指针的不同(1),数组名是一个指针常量,不能修改值,如:,ia+;,ia,0,ia,1,ia,2,ia,3,ia,4,ia,p,P+=2;,6.2 数组类型,数组与指针的不同(2),int ia5;,int*p=ia;,coutsizeof(ia);,coutsizeof(p);,/输出20,指向整个数组的空间,/输出4,只是指针变量自己,/数组有局限性,空间是固定的,而指针是灵活的,6.2 数组类型,指针数组与数组指针,指针数组,数组中的每个元素都是一个指针,例:,int *ptr_array10;,int age1=30,age2=54;/,的优先级高于*,ptr_array0=,/指针数组中第一个元素指向age1,ptr_array1=,/指针数组中第二个元素指向age2,int *(ptr_array10);,6.2 数组类型,指针数组与数组指针,数组指针,例:,int (*p)3;/p是一个指向一维数组的指 针,该数组有3个int型元素,6.3 字符串,字符数组,指向字符串的指针数组,关于字符串操作的库函数,6.3 字符串,字符串:,“This is a program!n”,长度:字符总数+1,字符总数包括:空格、标点、转义字符,C+没有提供字符串类型,它用数组和指针来处理字符串,6.3 字符串,字符数组,字符串变量的类型:字符数组,同样遵循“先声明,后使用”,6.3 字符串,字符数组的定义及初始化,char name10;,char name10=“Hello”;,char name10=H,e,l,l,o,0;,char name10=“Hello”;,char name=“Hello”;,注:,1、字符串以0结束,而字符数组不一定以0结束,2、字符串长度不能超过下标,6.3 字符串,字符数组的使用,for(i=0;inamei;,/访问每一个字符,以0结束的字符串数组可以直接输入和输出,例:,cinname;,/把name作为一个整体,coutname;,/系统会自动在串尾加0,这正是字符数组与其他数组的不同,6.3 字符串,指向字符串的指针数组,例:需要将计算机专业的所有课程名称存储起来,共24门课,每门课名称不超过30个字符,可以定义一个24,30的二维数组,const int max_sub=24;,const int max_len=30;,char subjectsmax_submax_len;,6.3 字符串,这种数据结构存在两个问题:,课程名不等长,会浪费内存空间,必须事先知道最长的课程名是多少字符,若用指针数组,可以避免这两个问题,const int max_sub=24;,char*subjectsmax_sub;,char*subjects=“Object_Oriented Program0”,”Operation System0”,”Network0”,“Datebase0”,;,6.3 字符串,字符串指针数组的存储方式,.,.,.,.,.,Object_Oriented Program0,Operation System0,Network0,Datebase0,Software Engineering0,subjects0,subjects1,subjects2,subjects3,subjects4,例:cout*subjects;,/,显示第一门课程名,cout*(subjects+2);,/,显示第三门课程名,6.3 字符串,数组应用举例,一个班有30个学生,从键盘输入每个学生的名字和成绩,输出第一名学生的成绩和全班的平均成绩,#include/学生名使用二维数组,void main(),const int STU_NUM=30;,char stu_nameSTU_NUM20;,int stu_scoreSTU_NUM;,int sum=0,highest=0;,float average;,for(int i=0;istu_nameistu_scorei;,for(i=0;iSTU_NUM;i+),sum+=stu_scorei;,if(stu_scorehigheststu_scorei),highest=i;,average=1.0*sum/STU_NUM;,coutThe highest student is:stu_namehighestendl;,coutThe highest score is:stu_scorehighestendl;,coutThe average score is:averageendl;,/输入学生名和学生成绩,#include/学生名使用指针数组,void main(),const int STU_NUM=30;,char*stu_nameSTU_NUM;,int stu_scoreSTU_NUM;,int sum=0,highest=0;,float average;,for(int i=0;i,*stu_name,stu_scorei;,for(i=0;iSTU_NUM;i+),sum+=stu_scorei;,if(stu_scorehigheststu_scorei),highest=i;,average=1.0*sum/STU_NUM;,coutThe highest student is:,*stu_name,endl;,coutThe highest score is:stu_scorehighestendl;,coutThe average score is:average公有成员;,如:file_ptr-rename();,注:,只能访问对象的公有成员,不能用,.,或*,6.4 指向对象的指针,使用对象指针的好处,减少内存空间的占用,可以控制构造函数与析构函数的调用时间,使用灵活,方便,6.4 指向对象的指针,对象的动态创建与撤销,在程序运行过程中根据需要随时可以建立或删除对象,动态创建的对象被存放在内存的“堆”中,动态创建或删除对象时,需要两个运算符,new 和 delete,称为动态分配内存空间运算符,6.4 指向对象的指针,new 的用法,对象指针=new 类名(初始值表);,表明在“堆”中创建一个属于“类名”的对象,并用(初始值表)初始化被创建的对象,若省略圆括号则被创建的对象使用缺省值,new运算符返回一个指针,若new不能分配到所需的内存,将返回0,这时的指针为空指针,6.4 指向对象的指针,用new创建对象数组,例:A*ptr;,ptr=new A5;,new A5,创建了一个对象数组,有5个元素,new的返回值赋给指针,ptr,,使得,ptr,指向对象数组,6.4 指向对象的指针,用new创建基类型的变量或数组,例:int*p;,p=new int10;,在程序运行中,动态申请了10个整数空间,p是指向int型变量的指针,用new创建了一个具有10个元素的一维整型数组,并使p指向这个数组的首元素,注:,用new创建的数组不能指定初始值,6.4 指向对象的指针,delete的用法,delete的作用,用于删除使用new创建的对象或一般类型的指针,并释放指针指向的内存空间,delete的用法,delete 指针名;,或,delete 指针名;,6.4 指向对象的指针,例:A*ptr;,ptr=new A(5,6);,delete ptr;,注:,用new创建对象时,调用构造函数,用delete撤销对象时,调用析构函数,用new申请的空间必须用delete释放,用new 申请的空间必须用delete 释放,在用new 创建对象数组的程序中,类中必须说明,默认构造函数,6.4 指向对象的指针,例:,char*str=new char20;/delete str;,float*fa=new float100;/delete fa;,short*sp=new short(5);/delete sp;,6.4 指向对象的指针,new、delete应用举例,例1,.,用new、delete创建和释放对象,例2,.,用new、delete创建和释放普通数组,请分析程序的输出结果,例1 分析程序的输出结果,#include,class AA,public:,AA(int i,int j),a=i;b=j;,coutconstructor.n;,AA(),coutDestructor.n;,void print();,private:,int a,b;,;,void AA:print(),couta,bprint();,a2-print();,delete a1;,delete a2;,例2 分析程序的输出结果,#include,#include,void fun(),int*p;,p=new int;,if(p),*p=5;,cout*pendl;,delete p;,else,coutHeap error!n;,void main(),fun();,int*pa;,pa=new int5;,if(!pa),coutHeap error!n;,exit(1);,for(int i=0;i5;i+),pai=i+1;,for(i=0;i5;i+),coutpai;,coutendl;,delete pa;,6.5 指向函数的指针,函数指针,每个函数都有地址,指向函数地址的指针称为函数指针,函数指针指向代码区中的某个函数,通过函数指针可以调用相应的函数,6.5 指向函数的指针,函数指针的定义,int (*func)(char a,char b);,其中:,int函数的返回类型,*func表示定义的是指针,()表示是函数,a,b函数的两个字符型参数,6.5 指向函数的指针,二者的区别,int (*func)(char a,char b);,int *func(char a,char b);,前者是函数指针的定义,后者是函数定义,函数的返回值为指针,,因为()的优先级高于*,6.5 指向函数的指针,函数指针必须与它所指向的函数一致,(函数的返回类型和参数保持一致),函数与函数指针操作的相互关系,int n1(char x,char y);,int *n2(char x,char y);,int n3(int a);,int (*p1)(char a,char b);,int (*p2)(int s);,P1=n1;/ok!,P1=n2;/error!,P2=n3;/ok!,P2=p1;/error!,P2=n3(5);/error!,6.5 指向函数的指针,说明:,函数指针与其它数据类型的指针不同,函数指针指向内存的代码区,(程序运行的指令代码),数据指针指向内存的数据区、栈区、堆区,(程序赖以运行的各种数据),因此,,两类指针不能相互赋值,6.5 指向函数的指针,通过函数指针来调用函数,函数及函数指针的定义,int n3(int a);,int (*p2)(int s);,必须给函数指针赋值,p2=n3;,通过函数指针来调用函数,p2(5);,函数指针用作函数参数(见下例),例:,计算以0.1为步长,特定范围内的三角函数之和,#include,#include,double sigma(double(*pfunc)(double),double dl,double du),double dt=0.0;,for(double d=dl;ddu;d+=0.1),dt+=pfunc(d);,/用函数指针调用函数,return dt;,void main(),double dsum;,dsum=sigma(sin,0.1,1.0);,coutThe sum of sin from 0.1 to 1.0 is:dsumendl;,dsum=sigma(cos,0.5,3.0);,coutThe sum of cos from 0.5 to 3.0is:dsumendl;,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 教育专区 > 小学其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服