ImageVerifierCode 换一换
格式:PPT , 页数:78 ,大小:694.50KB ,
文档编号:2711411      下载积分:28 文币
快捷下载
登录下载
邮箱/手机:
温馨提示:
系统将以此处填写的邮箱或者手机号生成账号和密码,方便再次下载。 如填写123,账号和密码都是123。
支付方式: 支付宝    微信支付   
验证码:   换一换

优惠套餐
 

温馨提示:若手机下载失败,请复制以下地址【https://www.163wenku.com/d-2711411.html】到电脑浏览器->登陆(账号密码均为手机号或邮箱;不要扫码登陆)->重新下载(不再收费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录  
下载须知

1: 试题类文档的标题没说有答案,则无答案;主观题也可能无答案。PPT的音视频可能无法播放。 请谨慎下单,一旦售出,概不退换。
2: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
3: 本文为用户(晟晟文业)主动上传,所有收益归该用户。163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

1,本文(信息学奥赛课课通-第8单元-电子课件.ppt)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!

信息学奥赛课课通-第8单元-电子课件.ppt

1、 高等教育出版社高等教育出版社 第第 8 单元单元 指针指针作者:林厚从作者:林厚从信息学奥赛课课通(信息学奥赛课课通(C+C+)高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)第第 1 课课 指针的概念指针的概念学习目标学习目标1. 理解指针的概念。理解指针的概念。2. 学会定义和使用指针。学会定义和使用指针。高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)指针指针指针是指针是 C+ 语言的一个重要概念,也是语言的一个重要概念,也是 C+ 语言的重语言的重要特色。要特色。C+ 语言的高度灵活性及极强的表达能力,在很语言的高度灵活性及极强的表达能力,

2、在很大程度上表现在巧妙而灵活的运用指针。通过指针可以有大程度上表现在巧妙而灵活的运用指针。通过指针可以有效地表示复杂的数据结构;能够方便地处理数组和字符串;效地表示复杂的数据结构;能够方便地处理数组和字符串;能够动态地分配内存,直接对内存地址进行操作;利用指能够动态地分配内存,直接对内存地址进行操作;利用指针作为函数参数,能够实现针作为函数参数,能够实现“一次函数调用,有多个返回一次函数调用,有多个返回值值”的目的。因此,必须深入学习和理解指针的概念,体的目的。因此,必须深入学习和理解指针的概念,体会和掌握指针的各种操作,熟练应用指针去实践编程。会和掌握指针的各种操作,熟练应用指针去实践编程。

3、高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)1. 指针的概念指针的概念对于对于“int a = 3;”,系统会在内存的某个区域开辟连续,系统会在内存的某个区域开辟连续4个字节的单元存储。对个字节的单元存储。对 a 的操作就是对该内存区域进行操的操作就是对该内存区域进行操作,至于是具体的哪作,至于是具体的哪4个单元,我们并不关心。个单元,我们并不关心。内存单元的位置(编号)叫作内存单元的位置(编号)叫作“地址地址”,可以通过,可以通过取地取地址操作符址操作符“&”获得一个变量获得一个变量 a 的起始地址的起始地址(首个存储单元(首个存储单元的地址):的地址):&a。指针

4、也是一个变量。和普通变量不同的是,指针变量里指针也是一个变量。和普通变量不同的是,指针变量里存储的数据是一个内存地址,就好像一个指示器,指引着存储的数据是一个内存地址,就好像一个指示器,指引着你去该内存地址开始的一块内存区域存取数据。你去该内存地址开始的一块内存区域存取数据。高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)2. 指针的定义和使用指针的定义和使用指针变量的定义格式为:指针变量的定义格式为:数据类型数据类型 *指针变量指针变量;可以通过赋值语句给指针变可以通过赋值语句给指针变量赋值,例如量赋值,例如“p = &a;”表示表示把变量把变量 a 的内存地址赋值给的

5、内存地址赋值给 p,如图如图 8.1-1 所示。所示。指针变量初始化:指针变量初始化:int *p = NULL;高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)例例1、数字变化、数字变化【问题描述问题描述】输入两个不同的整数,把较小的那个数翻倍并输出。输入两个不同的整数,把较小的那个数翻倍并输出。【输入格式输入格式】一行两个整数(一行两个整数(int 范围以内),之间用一个空格隔开。范围以内),之间用一个空格隔开。【输出格式输出格式】一行一个整数,较小数翻倍后的结果。一行一个整数,较小数翻倍后的结果。【输入样例输入样例】2 3【输出样例输出样例】4高等教育出版社高等教育

6、出版社信息学奥赛课课通(信息学奥赛课课通(C+)/p8-1-1#includeusing namespace std;int main() int a,b; int *p; cin a b; if(a b) p = &a; else p = &b; cout *p * 2 endl; / 取出取出 p 指向的内存单元里的整数,乘以指向的内存单元里的整数,乘以 2 输出输出 return 0;高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)【程序说明程序说明】1) 变量变量 a 和和 b 一旦定义,系统就会给它们分配内存空一旦定义,系统就会给它们分配内存空间,而且在程序运行

7、过程中,其内存地址是固定不变的,间,而且在程序运行过程中,其内存地址是固定不变的,这种存储方式称为这种存储方式称为“静态存储静态存储”。2) 指针变量指针变量 p 定义后,其地址空间是不确定的,默认定义后,其地址空间是不确定的,默认是是 NULL。当执行到。当执行到 p = &a 或者或者 p = &b 时,时,p 才指向才指向 a 或或者者 b 的地址,才能确定的地址,才能确定 p 的值。这种储存方式称为的值。这种储存方式称为“动态动态存储存储”。3) 指针的动态性,还体现在可以根据需要,通过函数指针的动态性,还体现在可以根据需要,通过函数 new()随时申请。看以下例()随时申请。看以下例

8、2:高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)例例2、阅读程序,写出程序的运行结果。、阅读程序,写出程序的运行结果。/p8-1-2#includeusing namespace std;int main() int *p; char *q; p = new(int); q = new(char); *p = 65; *q = *p; cout *p “ “ *q endl; return 0;高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)【程序说明程序说明】1)运行程序,输出结果为)运行程序,输出结果为“65 A”。2)程序中声明了两个指针类

9、型:一个指向整数类型的)程序中声明了两个指针类型:一个指向整数类型的指针指针 p 和一个指向字符类型的指针和一个指向字符类型的指针 q ,分别通过,分别通过 new(int) 和和 new(char) 为为 p 和和 q 向内存申请空间。向内存申请空间。3)“*p = 65;”把把 65 这个整数存放到这个整数存放到 p 所指向的内所指向的内存单元。存单元。4)“*q = *p; ”把把 p 所指向的内存单元里的值赋值给所指向的内存单元里的值赋值给 q 所指向的内存单元,由于所指向的内存单元,由于 q 指向的是一个字符类型,而指向的是一个字符类型,而 p 指向的是一个整数类型,在赋值的时候执行

10、了类型的强制指向的是一个整数类型,在赋值的时候执行了类型的强制转换,最终转换,最终 q 所指向的内存单元里存储的是所指向的内存单元里存储的是 65 号字符即为号字符即为 A。高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)3. 指针的理解指针的理解高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)(1)指针的类型)指针的类型从语法角度看,把指针定义语句里的指针名字去掉,剩从语法角度看,把指针定义语句里的指针名字去掉,剩下的部分就是这个指针的类型,也就是指针本身所具有的下的部分就是这个指针的类型,也就是指针本身所具有的类型。类型。int *ptr; /

11、指针的类型是指针的类型是 int *char *ptr; / 指针的类型是指针的类型是 char *int *ptr; / 指针的类型是指针的类型是 int *int (*ptr)3; / 指针的类型是指针的类型是 int(*)3int *(*ptr)4; / 指针的类型是指针的类型是 int *(*)4高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)(2)指针所指向的类型)指针所指向的类型当通过指针来访问指针所指向的内存区域时,指针所指当通过指针来访问指针所指向的内存区域时,指针所指向的类型决定了编译器将把那片内存区域里的内容当作什向的类型决定了编译器将把那片内存区域里

12、的内容当作什么来看待。从语法上看,把指针定义语句中的指针名字和么来看待。从语法上看,把指针定义语句中的指针名字和名字左边的指针声明符名字左边的指针声明符“*”去掉,剩下的就是指针所指向去掉,剩下的就是指针所指向的类型。的类型。int *ptr; / 指针所指向的类型是指针所指向的类型是 intchar *ptr; / 指针所指向的类型是指针所指向的类型是 charint *ptr; / 指针所指向的类型是指针所指向的类型是 int *int (*ptr)3; / 指针所指向的类型是指针所指向的类型是 int()3int *(*ptr)4; / 指针所指向的类型是指针所指向的类型是 int *(

13、)4在指针的算术运算中,指针所指向的类型有很大的作用。在指针的算术运算中,指针所指向的类型有很大的作用。指针的类型和指针所指向的类型是两个不同的概念。指针的类型和指针所指向的类型是两个不同的概念。高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)(3)指针的值)指针的值指针的值是指针本身存储的数值,这个值将被编译器当指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一般的数值。在位长作一个地址,而不是一般的数值。在位长 32 位的系统中,位的系统中,内存地址都是内存地址都是 32 位的,所以所有类型的指针的值都是一个位的,所以所有类型的指针的值都是一个 32

14、 位整数。指针所指向的内存区域就是从指针的值所代表位整数。指针所指向的内存区域就是从指针的值所代表的那个内存地址开始,长度为的那个内存地址开始,长度为sizeof (指针所指向的类型)(指针所指向的类型)的一片内存区域。我们说一个指针的值是的一片内存区域。我们说一个指针的值是 X,就相当于说该,就相当于说该指针指向了以指针指向了以 X 为首地址的一片内存区域。指针所指向的为首地址的一片内存区域。指针所指向的内存区域和指针所指向的类型是两个完全不同的概念。内存区域和指针所指向的类型是两个完全不同的概念。高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)(4)指针本身所占据的内

15、存区)指针本身所占据的内存区用函数用函数 sizeof (指针的类型)测一下就知道了。在(指针的类型)测一下就知道了。在 32 位的系统中,指针本身占据了位的系统中,指针本身占据了 4 字节的长度。字节的长度。高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)例例3、阅读程序,写出程序的运行结果。、阅读程序,写出程序的运行结果。/p8-1-3#includeusing namespace std;int main() int *p,*q; p = (int *)malloc(40); / 动态申请动态申请 40 字节用来存放字节用来存放 int 类型,并返回首地址给类型,并

16、返回首地址给 p q = p; *p = 1; p+; *p = 2; free(q);/ 释放刚才申请的释放刚才申请的 40 字节的空间字节的空间 return 0;高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)【程序说明程序说明】(1)单步跟踪程序,发现单步跟踪程序,发现执行完执行完“*p = 1;”,q和和p为同一个地址为同一个地址,*p和和*q的值也都是的值也都是1。 (2)继续跟踪继续跟踪程序程序,执行完执行完“*p = 2;”,p 指向了下一个整数空间,在原指向了下一个整数空间,在原来的地址上加来的地址上加4,因为一个整型占,因为一个整型占4个字节。个字节。

17、*p 的值也变成了的值也变成了2。 (3)程序中的)程序中的“free(q);”是释放一开始申请的是释放一开始申请的40个字节的内存空间,是配个字节的内存空间,是配合合malloc()使用。注意释放的是内存,使用。注意释放的是内存,q和和p的地址还在,指针并没有被释放的地址还在,指针并没有被释放,指针仍然指向原来的存储空间。指针是一个变量,只有程序结束时才被,指针仍然指向原来的存储空间。指针是一个变量,只有程序结束时才被销毁。释放了内存空间后,原来指向这块空间的指针还是存在,只不过现销毁。释放了内存空间后,原来指向这块空间的指针还是存在,只不过现在指针指向的内容是未定义的,里面可能会有一些垃圾

18、内容。在指针指向的内容是未定义的,里面可能会有一些垃圾内容。继续跟踪看继续跟踪看看看p、q、*p、*q的值。的值。 高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)动态申请内存动态申请内存(1)malloc() void* malloc(unsigned size);在内存的动态存储区中分配一块长度为在内存的动态存储区中分配一块长度为size字字节的连续区域,参数节的连续区域,参数size为需要内存空间的长度,返回该区域的首地址。为需要内存空间的长度,返回该区域的首地址。(2)calloc() void* calloc(size_t numelements, size_t

19、 sizeofelement);与与malloc相似,参相似,参数数sizeofelement为申请地址的单位元素长度,为申请地址的单位元素长度,numelements为元素个数,即为元素个数,即在内存中申请在内存中申请numelements*sizeofelement字节大小的连续地址空间。字节大小的连续地址空间。(3)realloc() void* realloc(void* ptr, unsigned newsize);给一个已经分配了地址的指针给一个已经分配了地址的指针重新分配空间,参数重新分配空间,参数ptr为原有的空间地址,为原有的空间地址,newsize是重新申请的地址长是重新申

20、请的地址长度。度。高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)实践巩固实践巩固高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)第第 2 课课 指针的引用与运算指针的引用与运算学习目标学习目标1. 理解并学会引用指针。理解并学会引用指针。2. 掌握指针的常用运算。掌握指针的常用运算。高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)1. 指针的引用指针的引用首先理解指针变量与普通变量的区别和对应关系。例如,首先理解指针变量与普通变量的区别和对应关系。例如,定义一个指针变量定义一个指针变量“int *p;”和一个普通变量和一个普通

21、变量“int a;”,关于两者之间的各种引用方式对应关系如下:关于两者之间的各种引用方式对应关系如下:1)“p”等同于等同于“&a”,表示的是内存地址。,表示的是内存地址。2)“*p”等同于等同于“a”,表示变量里存储的实际数据。,表示变量里存储的实际数据。3)“*p = 3;”等同于等同于“a = 3;”,表示变量的赋值,表示变量的赋值方法。方法。高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)2. 指针的运算指针的运算如果定义的是局部指针变量,其地址就是随机的,直接如果定义的是局部指针变量,其地址就是随机的,直接操作会引发不可预测的错误。所以,指针变量一定要初始操作会

22、引发不可预测的错误。所以,指针变量一定要初始化后才能引用。化后才能引用。由于指针变量存储的是内存地址,所以也可以执行加法、由于指针变量存储的是内存地址,所以也可以执行加法、减法运算,一般用来配合数组进行寻址操作减法运算,一般用来配合数组进行寻址操作。例如:例如:高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)例例1、阅读并上机调试以下程序,体会指针变量的加法运算。、阅读并上机调试以下程序,体会指针变量的加法运算。/p8-2-1#includeusing namespace std;int main() int a100,n; cin n; for(int i = 0; i

23、 ai; int *p = &a0; / 指针指针 p 指向数组首元素的地址指向数组首元素的地址 for(int i = 0; i n; i+) cout *p endl; p+; / 指针每次往后移动一个区域指针每次往后移动一个区域 return 0;高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)【问题分析问题分析】1)程序的作用是输入)程序的作用是输入 n 及及 n 个整数,使用指针变量依个整数,使用指针变量依次遍历输出。次遍历输出。2)程序中的)程序中的“p+” 是广义的是广义的“p = p + 1 ”,本质上是,本质上是“p + sizeof(int)”。3)注

24、意,)注意,“*p+3”和和“*(p+3)”是不同的。对于本是不同的。对于本题,前者是指题,前者是指 a0+3,而后者是指,而后者是指 a3。高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)例例2、求和求和【问题描述问题描述】输入输入 n 个正整数,要求对这个正整数,要求对这 n 个数中的奇数和个数中的奇数和偶数分别求和。偶数分别求和。【输入格式输入格式】第第 1 行行 1 个正整数个正整数 n,1n5000。以下以下 n 行,每行一个正整数(行,每行一个正整数(120000 之间)。之间)。【输出格式输出格式】2 行行 2 个整数。第个整数。第 1 行为所有奇数之和,第

25、行为所有奇数之和,第 2 行行为所有偶数之和。为所有偶数之和。【输入样例输入样例】5310758【输出样例输出样例】1518高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)/p8-2-2#includeusing namespace std;int main() int n,a5011; int *p,*s1,*s2; /s1 和和 s2 指向的单元分别存放偶数和、奇数和指向的单元分别存放偶数和、奇数和 cin n; for(int i = 0; i ai; p = &a0; s1 = new(int); / 申请一个存放整数类型的内存空间,把地址记录在申请一个存放整数类

26、型的内存空间,把地址记录在 s1 中中 *s1 = 0; / 累加器赋初值累加器赋初值 0 s2 = new(int); / 申请一个存放整数类型的内存空间,把地址记录在申请一个存放整数类型的内存空间,把地址记录在 s2 中中 *s2 = 0; / 累加器赋初值累加器赋初值 0 for(int i = 0; i n; i+) if(*p % 2 = 0) *s1 += *p; else *s2 += *p; p+; cout *s2 endl *s1 endl; return 0;高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)例例3、阅读并上机调试以下程序,体会无类型指

27、针的使用。、阅读并上机调试以下程序,体会无类型指针的使用。/p8-2-3#includeusing namespace std;int main() int a = 10; double b = 3.5; void *p; p = &a; cout *(int *)p endl; p = &b; cout *(double *)p endl; return 0;高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)例例4、阅读并上机调试以下程序,体会多重指针的使用。、阅读并上机调试以下程序,体会多重指针的使用。/p8-2-4#include using namespace st

28、d;int main() int a = 10; int *p; int *pp; p = &a; pp = &p; cout a “ = ” *p “ = ” *pp endl; return 0;高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)实践巩固实践巩固高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)第第 3 课课 指针与数组指针与数组学习目标学习目标1. 理解数组指针。理解数组指针。2. 学会使用指针实现数组操作。学会使用指针实现数组操作。3. 学会使用指针实现字符串操作。学会使用指针实现字符串操作。高等教育出版社高等教育出版社信息学奥赛

29、课课通(信息学奥赛课课通(C+)指针与数组指针与数组在在 C+ 中,数组名在一定意义上可以被看成指针。中,数组名在一定意义上可以被看成指针。“数数组的指针组的指针”是指整个数组在内存中的起始地址,是指整个数组在内存中的起始地址,“数组元素数组元素的指针的指针”是指数组中某个元素所占存储单元的地址。一般可是指数组中某个元素所占存储单元的地址。一般可以使用以使用“下标法下标法”访问数组元素,如访问数组元素,如 a5;也可以使用;也可以使用“地址地址法法”访问数组元素,因为数组名就代表数组在内存中的起始访问数组元素,因为数组名就代表数组在内存中的起始地址,也就是地址,也就是 a 0 的地址,如的地址

30、,如 a+4 就表示就表示 a 4 的地址;也可的地址;也可以通过以通过“指针法指针法”访问数组元素,通过数组的指针或者数组访问数组元素,通过数组的指针或者数组元素的指针访问数组元素,能使目标程序质量更高,占用内元素的指针访问数组元素,能使目标程序质量更高,占用内存更少,运行速度更快。存更少,运行速度更快。高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)例例1、阅读并上机调试以下程序,体会数组的指针和、阅读并上机调试以下程序,体会数组的指针和数组元素的指针。数组元素的指针。/p8-3-1#includeusing namespace std;int main()int a

31、 = 10,11,12,13,14,15;int *p = a+4;cout *a;cout “ “ *(a+3);cout “ “ *(+p) endl;return 0;高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)【问题分析问题分析】1)运行程序,输出)运行程序,输出“10 13 15”。2)程序中直接拿数组名)程序中直接拿数组名 a 当指针用。但是当指针用。但是 a 始终是静态始终是静态的,是不可变的,不能做的,是不可变的,不能做“a = a+4;”运算,而指针可以做运算,而指针可以做“+p”或或“p = p+4;”运算。运算。3)语句)语句“scanf ( “

32、 %d “ ,&n););”其实就是指针的其实就是指针的意思。如果是数组,就不需要加取地址符意思。如果是数组,就不需要加取地址符“&”。高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)例例2、阅读并上机调试以下程序,体会动态数组的定、阅读并上机调试以下程序,体会动态数组的定义和使用。义和使用。/p8-3-2#includeusing namespace std;int main() int n,*a; cin n; a = new int n; / 申请申请 n 个连续的个连续的 int 类型内存空间(动态数组),并返回首地址给类型内存空间(动态数组),并返回首地址给 a

33、 for(int i = 0; i ai; for(int i = 1; i n; i+) ai += ai-1; for(int i = 0; i n-1; i+) cout ai “ “ ; cout an-1 endl; return 0;高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)【问题分析问题分析】1)运行程序,输入)运行程序,输入 10 及如下及如下 10 个数个数“1 2 3 4 5 6 7 8 9 10”,输出,输出“1 3 6 10 15 21 28 36 45 55”。2)因为指针可以动态申请空间。那一次申请)因为指针可以动态申请空间。那一次申请

34、100 个变量个变量空间,系统给的地址是连续的,就可以当成数组使用,这就空间,系统给的地址是连续的,就可以当成数组使用,这就是是“动态数组动态数组”的一种。的一种。3)在信息学竞赛中遇到大批量数据的情况下,数组开小)在信息学竞赛中遇到大批量数据的情况下,数组开小只能拿部分分,开大又可能爆空间,此时就可以定义和使用只能拿部分分,开大又可能爆空间,此时就可以定义和使用动态数组。动态数组。高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)例例3、行列转换、行列转换【问题描述问题描述】对于一个对于一个 nm 的稀疏矩阵,按照行、列、值的的稀疏矩阵,按照行、列、值的格式读入格式读入

35、k 个元素(其他位置的值为个元素(其他位置的值为 0),再输),再输出这些数。出这些数。【输入格式输入格式】第第 1 行行 3 个整数,表示个整数,表示 n、m 和和 k,每两个数之,每两个数之间用一个空格隔开。间用一个空格隔开。以下以下 k 行,按照行,按照“行优先(从上到下、从左到行优先(从上到下、从左到右)右)”的方式读入的方式读入 k 个非个非 0 元素。每行元素。每行 3 个数,个数,依次为行号、列号、元素值,每两个数之间用一依次为行号、列号、元素值,每两个数之间用一个空格隔开。个空格隔开。【输出格式输出格式】输出输出k个数,按照个数,按照“列优先(从左到右、从上到列优先(从左到右、

36、从上到下)下)”的方式输出,每两个数之间用一个空格隔的方式输出,每两个数之间用一个空格隔开。开。【输入样例输入样例】4 5 31 2 121 4 234 3 45【输出样例输出样例】12 45 23高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)例例4、阅读并上机调试以下程序,体会使用指针实现、阅读并上机调试以下程序,体会使用指针实现字符串的输入输出及存储。字符串的输入输出及存储。/p8-3-4#include#includeusing namespace std;int main() char *s; s = new char; / 给给 s 申请一个地址申请一个地址

37、cin s; / 输入字符串以空格或者回车结束输入字符串以空格或者回车结束 cout s endl; cout strlen(s); return 0;高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)【程序说明程序说明】运行程序,输入运行程序,输入“hello world!”。输出:输出:hello5使用指针实现字符串的输入、输出及存储,与普通数组类使用指针实现字符串的输入、输出及存储,与普通数组类似。只是在使用前一定要给字符串变量指定一个地址。似。只是在使用前一定要给字符串变量指定一个地址。高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)例例5、阅

38、读并上机调试以下程序,体会使用指针实现、阅读并上机调试以下程序,体会使用指针实现字符串的复制。字符串的复制。/p8-3-5#includeusing namespace std;void copy_string(char *from,char *to)/ 用字符指针作为函数参数用字符指针作为函数参数 while(*from != 0 ) *to = *from; *to+; *from+; *to = 0 ;/ 在结束位置强制加结束符在结束位置强制加结束符int main() char a20 = “ c language ” ; char b20 = “ very good ” ; copy

39、_string(a,b); cout a endl; cout b endl; return 0;高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)实践巩固实践巩固高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)第第 4 课课 函数指针及扩展函数指针及扩展学习目标学习目标1. 理解并学会使用函数指针。理解并学会使用函数指针。2. 了解函数指针数组。了解函数指针数组。3. 了解引用与指针的区别。了解引用与指针的区别。4. 了解指向结构体的指针。了解指向结构体的指针。高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)函数指针及扩展函数指

40、针及扩展程序中需要处理的数据都保存在内存空间,而程序以及程序中需要处理的数据都保存在内存空间,而程序以及函数同样也保存在内存空间,函数同样也保存在内存空间,C+支持通过函数的入口地址支持通过函数的入口地址(指针)访问函数。另一方面,有些函数在编写时要调用(指针)访问函数。另一方面,有些函数在编写时要调用其他的辅助函数,但是尚未确定,在具体执行时,再为其其他的辅助函数,但是尚未确定,在具体执行时,再为其传递辅助函数的地址。比如排序函数传递辅助函数的地址。比如排序函数 sort (a,a+n,cmp),其中的比较函数),其中的比较函数 cmp 是根据需要传递给是根据需要传递给 sort 的,的,就

41、是传递了一个函数指针。就是传递了一个函数指针。函数指针就是指向函数的指针变量,定义格式如下:函数指针就是指向函数的指针变量,定义格式如下:类型名(类型名(* 函数名)(参数)函数名)(参数);高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)例例1、阅读并上机调试以下程序,体会函数指针的使、阅读并上机调试以下程序,体会函数指针的使用。用。/p8-4-1a#includeusing namespace std;int test (int a)return a * a;int main() cout test endl; / 或者或者 &test, 输出函数的地址输出函数的地址

42、 int (*fp) (int a); / 声明一个指向函数的指针变量声明一个指向函数的指针变量 fp fp = test; / 或者或者 &test, 将函数将函数 test 的入口地址传给的入口地址传给 fp cout fp(5) endl; / 调用函数调用函数 cout (*fp)(10) endl; return 0;高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)使用函数指针需要注意的几点:使用函数指针需要注意的几点:1)定义函数指针要与函数原型一致。例如,函数为)定义函数指针要与函数原型一致。例如,函数为“int test (int);”,则函数指针声明为,

43、则函数指针声明为“int (*fp) (int);”。2)获取函数的地址有两种方式:一种是直接使用函数名,)获取函数的地址有两种方式:一种是直接使用函数名,如如 test 或者或者 fp = test;另一种是使用取地址符,如;另一种是使用取地址符,如 &test 或者或者 fp = &test。3)调用函数有两种方式:一种是直接使用函数名,如)调用函数有两种方式:一种是直接使用函数名,如 fp(5);另一种是使用函数指针调用函数,如;另一种是使用函数指针调用函数,如 (*fp)(5)。4)函数指针还支持一种结合)函数指针还支持一种结合 typedef 的定义方式。参见的定义方式。参见下一页例

44、下一页例1的另一个程序:的另一个程序: 5)可以定义一个数组存放多个函数指针。参见例)可以定义一个数组存放多个函数指针。参见例2:高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)/p8-4-1b#includeusing namespace std;int add(int a,int b)return a + b;typedef int (*addp)(int,int); / 声明一个函数指针变量声明一个函数指针变量 addpint main() addp fp = add; / 定义定义 addp 类型的函数指针类型的函数指针 fp, 并赋值为并赋值为 add cout

45、 fp(2,3) endl; / 程序输出程序输出 5 return 0;高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)例例2、模拟计算器、模拟计算器【问题描述问题描述】输入两个正整数输入两个正整数 m 和和 n,再输入一个代表运算方案的数字,再输入一个代表运算方案的数字 k:1 代表求代表求 m+n 的值;的值;2 代表求代表求m-n 的值;的值;3 代表求代表求 mn 的值;的值;4 代表求代表求 m/n 的的值(整除)。请函数指针数组编程模拟计算器,输出相应的运算结果。值(整除)。请函数指针数组编程模拟计算器,输出相应的运算结果。【输入格式输入格式】第第 1 行为

46、行为 2 个正整数个正整数 m 和和 n;第第 2 行为行为 1 个正整数个正整数 k,1k4。【输出格式输出格式】一行一个整数,表示相应的运算结果。一行一个整数,表示相应的运算结果。【输入样例输入样例】6 81【输出样例输出样例】14高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)/p8-4-2#include#includeusing namespace std;int cal1(int a,int b)return a + b;int cal2(int a,int b)return a - b;int cal3(int a,int b)return a * b;in

47、t cal4(int a,int b)return a / b;typedef int (*f)(int a,int b); / 自定义一个函数指针变量类型自定义一个函数指针变量类型 fint main() freopen( “ cal.in ” , ” r ” ,stdin); freopen( “ cal.out ” , ” w ” ,stdout); int m,n,k; f a4 = cal1,cal2,cal3,cal4; / 定义函数指针数组定义函数指针数组 a,4 个元素个元素 , 每个元素为每个元素为 f 类型类型 , 并且分别赋初值并且分别赋初值 cin m n k; cou

48、t ak-1(m,n) endl; / 用用 ak-1() 来调用相应的函数来调用相应的函数 return 0;高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)例例3、阅读并上机调试以下程序,体会引用变量的使、阅读并上机调试以下程序,体会引用变量的使用。用。/p8-4-3#includeusing namespace std;int main() int a = 10,b = 20; int *f; int &ra = a;/ 定义一个引用变量定义一个引用变量 ra, 同时初始化同时初始化 f = &a; cout “ a= ” *f endl; ra += 5; cou

49、t “ a= ” *f endl; return 0;高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)【问题分析问题分析】1)运行程序,输出:)运行程序,输出:a=10a=152)“引用变量引用变量”是是 C+ 中的一种复合类型,它的本质中的一种复合类型,它的本质就是给原变量起了一个别名,就像生活中有个人叫就是给原变量起了一个别名,就像生活中有个人叫“张张三三”,大家给他取了一个别名叫,大家给他取了一个别名叫“乐乐乐乐”,那么这两个名,那么这两个名字指的是同一个人。引用就相当于给原变量取了一个别名,字指的是同一个人。引用就相当于给原变量取了一个别名,对引用变量的操作就是对

50、原变量的操作。对引用变量的操作就是对原变量的操作。3)注意区分引用变量与指针变量,引用也不是取地址。)注意区分引用变量与指针变量,引用也不是取地址。另外,引用在定义的同时必须进行初始化,不能通过赋值另外,引用在定义的同时必须进行初始化,不能通过赋值语句,把对一个变量的引用改成对另一个变量的引用。语句,把对一个变量的引用改成对另一个变量的引用。4)程序中的)程序中的 a、*f 和和 ra 都是指向同一个内存地址。都是指向同一个内存地址。高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)5)使用引用会使程序代码更加简洁,一般用在多重数组)使用引用会使程序代码更加简洁,一般用在多

侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|