信息学奥赛课课通-第8单元-电子ppt课件.ppt
《信息学奥赛课课通-第8单元-电子ppt课件.ppt》由会员分享,可在线阅读,更多相关《信息学奥赛课课通-第8单元-电子ppt课件.ppt(78页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
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 的内存地址赋值给的内存地址赋值给 p,如图
5、如图 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()随时申请。看以下例()随时申请。看以下例2:高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)例
8、例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)程序中声明了两个指针类型:一个指向整数类型的)程序中声明了两个指针类型:一个指向整数类型的指针指针 p 和一个指向字符类型的指针和一个指向字
9、符类型的指针 q,分别通过,分别通过 new(int)和和 new(char)为为 p 和和 q 向内存申请空间。向内存申请空间。3)“*p=65;”把把 65 这个整数存放到这个整数存放到 p 所指向的内存所指向的内存单元。单元。4)“*q=*p;”把把 p 所指向的内存单元里的值赋值给所指向的内存单元里的值赋值给 q 所指向的内存单元,由于所指向的内存单元,由于 q 指向的是一个字符类型,而指向的是一个字符类型,而 p 指向的是一个整数类型,在赋值的时候执行了类型的强制转指向的是一个整数类型,在赋值的时候执行了类型的强制转换,最终换,最终 q 所指向的内存单元里存储的是所指向的内存单元里存
10、储的是 65 号字符即为号字符即为 A。高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)3.指针的理解指针的理解高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)(1)指针的类型)指针的类型从语法角度看,把指针定义语句里的指针名字去掉,剩从语法角度看,把指针定义语句里的指针名字去掉,剩下的部分就是这个指针的类型,也就是指针本身所具有的类下的部分就是这个指针的类型,也就是指针本身所具有的类型。型。int*ptr;/指针的类型是指针的类型是 int*char*ptr;/指针的类型是指针的类型是 char*int*ptr;/指针的类型是指针的类型是 int*
11、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*()4在指针的算术运算中,指针所指向的类型有很大的作用。在指针的算术运算中,指针所指向的类型有很大的作用。指针的类型和指针所指向的类型是两个不同的概念。指针的类型和指针所指向的类型是两个不同的概念。高等教育出版
13、社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)(3)指针的值)指针的值指针的值是指针本身存储的数值,这个值将被编译器当指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一般的数值。在位长作一个地址,而不是一般的数值。在位长 32 位的系统中,位的系统中,内存地址都是内存地址都是 32 位的,所以所有类型的指针的值都是一个位的,所以所有类型的指针的值都是一个 32 位整数。指针所指向的内存区域就是从指针的值所代表位整数。指针所指向的内存区域就是从指针的值所代表的那个内存地址开始,长度为的那个内存地址开始,长度为sizeof(指针所指向的类型)(指针所指向的类型)的一片
14、内存区域。我们说一个指针的值是的一片内存区域。我们说一个指针的值是 X,就相当于说该,就相当于说该指针指向了以指针指向了以 X 为首地址的一片内存区域。指针所指向的为首地址的一片内存区域。指针所指向的内存区域和指针所指向的类型是两个完全不同的概念。内存区域和指针所指向的类型是两个完全不同的概念。高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)(4)指针本身所占据的内存区)指针本身所占据的内存区用函数用函数 sizeof(指针的类型)测一下就知道了。在(指针的类型)测一下就知道了。在 32 位的系统中,指针本身占据了位的系统中,指针本身占据了 4 字节的长度。字节的长度。高
15、等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)例例3、阅读程序,写出程序的运行结果。、阅读程序,写出程序的运行结果。/p8-1-3#includeusing namespace std;int main()int*p,*q;p=(int*)malloc(40);/动态申请动态申请 40 字节用来存放字节用来存放 int 类型,并返回首地址给类型,并返回首地址给 p q=p;*p=1;p+;*p=2;free(q);/释放刚才申请的释放刚才申请的 40 字节的空间字节的空间 return 0;高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)【程序说明程
16、序说明】(1)单步跟踪程序,发现单步跟踪程序,发现执行完执行完“*p=1;”,q和和p为同一个地址为同一个地址,*p和和*q的值也都是的值也都是1。(2)继续跟踪继续跟踪程序程序,执行完执行完“*p=2;”,p 指向了下一个整数空间,在原指向了下一个整数空间,在原来的地址上加来的地址上加4,因为一个整型占,因为一个整型占4个字节。个字节。*p 的值也变成了的值也变成了2。(3)程序中的)程序中的“free(q);”是释放一开始申请的是释放一开始申请的40个字节的内存空间,是个字节的内存空间,是配合配合malloc()使用。注意释放的是内存,使用。注意释放的是内存,q和和p的地址还在,指针并没有
17、被释的地址还在,指针并没有被释放,指针仍然指向原来的存储空间。指针是一个变量,只有程序结束时才被放,指针仍然指向原来的存储空间。指针是一个变量,只有程序结束时才被销毁。释放了内存空间后,原来指向这块空间的指针还是存在,只不过现在销毁。释放了内存空间后,原来指向这块空间的指针还是存在,只不过现在指针指向的内容是未定义的,里面可能会有一些垃圾内容。指针指向的内容是未定义的,里面可能会有一些垃圾内容。继续跟踪看看继续跟踪看看p、q、*p、*q的值。的值。高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)动态申请内存动态申请内存(1)malloc()void*malloc(unsi
18、gned size);在内存的动态存储区中分配一块长度为在内存的动态存储区中分配一块长度为size字字节的连续区域,参数节的连续区域,参数size为需要内存空间的长度,返回该区域的首地址。为需要内存空间的长度,返回该区域的首地址。(2)calloc()void*calloc(size_t numelements,size_t sizeofelement);与与malloc相似,参相似,参数数sizeofelement为申请地址的单位元素长度,为申请地址的单位元素长度,numelements为元素个数,即为元素个数,即在内存中申请在内存中申请numelements*sizeofelement字节
19、大小的连续地址空间。字节大小的连续地址空间。(3)realloc()void*realloc(void*ptr,unsigned newsize);给一个已经分配了地址的指针给一个已经分配了地址的指针重新分配空间,参数重新分配空间,参数ptr为原有的空间地址,为原有的空间地址,newsize是重新申请的地址长度。是重新申请的地址长度。高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)实践巩固实践巩固高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)第第 2 课课 指针的引用与运算指针的引用与运算学习目标学习目标1.理解并学会引用指针。理解并学会引用指针。
20、2.掌握指针的常用运算。掌握指针的常用运算。高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)1.指针的引用指针的引用首先理解指针变量与普通变量的区别和对应关系。例如,首先理解指针变量与普通变量的区别和对应关系。例如,定义一个指针变量定义一个指针变量“int*p;”和一个普通变量和一个普通变量“int a;”,关于两者之间的各种引用方式对应关系如下:,关于两者之间的各种引用方式对应关系如下:1)“p”等同于等同于“&a”,表示的是内存地址。,表示的是内存地址。2)“*p”等同于等同于“a”,表示变量里存储的实际数据。,表示变量里存储的实际数据。3)“*p=3;”等同于等同于
21、“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 ai;int*p=&a0;/指针指针 p 指向数组首元素的地址指向数组首元素的地址 for(int i=0;i n;i+)cout *p endl;p+;/指针每次往后移动一个区域指针每次往后移动一个区域 return 0;高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)【问题分析问题
23、分析】1)程序的作用是输入)程序的作用是输入 n 及及 n 个整数,使用指针变量依个整数,使用指针变量依次遍历输出。次遍历输出。2)程序中的)程序中的“p+”是广义的是广义的“p=p+1”,本质上是,本质上是“p+sizeof(int)”。3)注意,)注意,“*p+3”和和“*(p+3)”是不同的。对于本是不同的。对于本题,前者是指题,前者是指 a0+3,而后者是指,而后者是指 a3。高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)例例2、求和、求和【问题描述问题描述】输入输入 n 个正整数,要求对这个正整数,要求对这 n 个数中的奇数和偶个数中的奇数和偶数分别求和。数分
24、别求和。【输入格式输入格式】第第 1 行行 1 个正整数个正整数 n,1n5000。以下以下 n 行,每行一个正整数(行,每行一个正整数(120000 之间)。之间)。【输出格式输出格式】2 行行 2 个整数。第个整数。第 1 行为所有奇数之和,第行为所有奇数之和,第 2 行行为所有偶数之和。为所有偶数之和。【输入样例输入样例】5310758【输出样例输出样例】1518高等教育出版社高等教育出版社信息学奥赛课课通(信息学奥赛课课通(C+)/p8-2-2#includeusing namespace std;int main()int n,a5011;int*p,*s1,*s2;/s1 和和 s
25、2 指向的单元分别存放偶数和、奇数和指向的单元分别存放偶数和、奇数和 cin n;for(int i=0;i ai;p=&a0;s1=new(int);/申请一个存放整数类型的内存空间,把地址记录在申请一个存放整数类型的内存空间,把地址记录在 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 end
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 信息学 奥赛课课通 单元 电子 ppt 课件
限制150内