C++大学基础教程第六章课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《C++大学基础教程第六章课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 大学 基础教程 第六 课件
- 资源描述:
-
1、2022-6-312022-6-32指针(指针(PointerPointer)是)是C+C+和和C C的的一种数据类型。很多其他高级一种数据类型。很多其他高级语言也有类似的数据类型。语言也有类似的数据类型。引用(引用(ReferenceReference)则是)则是C+C+所所特有的一种数据类型。特有的一种数据类型。2022-6-336.1 指针的概念 6.2 指针的运算 6.3 指针和函数 6.4 指针和字符串 6.5 通过指针访问数组 6.6 指针访问动态内存6.7 引用概念 2022-6-342022-6-35 指针是变量的地址地址例如,定义整型变量a,a的地址就是 一个指针。直接指定内
2、存某个地址开始(如 0 x00430100) 存放指针的变量就是指针变量。2022-6-36 当声明了一个指针变量后,确定了三件事:1. 变量本身在内存中所分配的地址和字节数(4个)2. 系统允许的地址范围,及地址单元内可以存放的内容3. 指针变量可以进行的运算 访问指针变量时,只能看到地址 通过这个地址访问地址单元中的内容,这样的访问称为对于内存单元的间接访问。2022-6-37 指针变量声明的格式是: 类型名 *变量名1, *变量名2; 例如: int *va1, *va2; char *ch1, *ch2; 指针变量在声明后,变量的值(地址)是随机的。这样的指针变量是不能安全的使用的20
3、22-6-38 在声明指针变量时的“*”,有两个含义:声明变量va1、ch1、ch2都是指针变量;说明变量va1的类型是(int *)型,即指向整型变量的指针。ch1和ch2的类型是(char *)型 指针变量都是有类型的- 所指定的地址单元中存放的数据的类型 2022-6-39 指针变量必须初始化后才能安全使用 声明指针变量时进行初始化的格式: 类型名 *指针变量名=&变量名; char ch1=Y, ch2=A; char *pch1=&ch1, *pch2=&ch2;2022-6-310 赋值方式进行初始化: int i1=Y, i2=A; int *pi1, *pi2; pi1=&i1
4、; pi2=&i2; 没有初始化的指针变量不可以使用 (编译系统会给出警告,而运行时会出现错误) 2022-6-3116.2 6.2 指针的运算指针的运算 2022-6-312 表6.1 指针的运算2022-6-313 指针的赋值: 地址的赋值地址的赋值 同类型变量的地址 同类型的已经初始化的指针变量; 其他同类型的指针 用0或者NULL赋值 “空指针”,即不指向任何的内存物理地址 不同类型的指针不可以互相赋值不同类型的指针不可以互相赋值在指针赋值时,不存在类型自动转换的机制2022-6-314 例6.1 观察以下指针赋值运算的结果。如果将注释去掉,结果将如何?#include using n
5、amespace std;void main()int va1=100,*pva1; int *pva2=NULL; float vf1=A,*pvf1,*pvf2;coutvalue of pva2 is pva2endl; pva1=&va1; pvf1=pvf2=&vf1; coutpva1 &va1endl; coutpvf1 pvf2endl; /pvf1=pva1;value of pva2 is 0 x000000000 x0012FF7C 0 x0012FF7C0 x0012FF74 0 x0012FF74 注释去掉会出现编译错误注释去掉会出现编译错误2022-6-315 间接
6、引用运算符“*” :一元运算符和指针变量连用,对指针所指向的内存地址单元进行间接访问 使用的格式: *指针变量 如果指针变量iptr指向整型变量va*iptr就是变量va的内容 2022-6-316 例6.2 对变量的直接访问和间接访问#include using namespace std; void main()char ch1=a,*ch; int k1=100; ch=&ch1; /指针ch指向变量ch1 cout*ch=*chendl;/间接访问 *ch=B; coutch1=ch1endl;/直接访问 ch1=k1; cout*ch=*chendl; /间接访问 运行结果运行结果:
7、*ch=ach1=B*ch=d2022-6-317 例6.3 观察对这种指针变量间接访问的结果。#include using namespace std;void main() int va=100,*pva,*ppva; /ppva是指向指针的指针 int k1=100; pva=&va; cout*pva=*pvaendl; /间接访问结果是整型数 ppva=&pva; cout*ppva=*ppvaendl; /间接访问结果是地址 coutpva=pvaendl; /就是指针pva的内容运行结果运行结果:*pva=100*ppva=0 x0012FF7C pva=0 x0012FF7C
8、2022-6-3182022-6-319可以进行的只有加法和减法加法和减法-和整数n做加法或者减法指针指针p p和整数和整数n n相相加加( (相减相减) )的含义的含义是指向当前指向是指向当前指向位置位置p p的前方或的前方或后方第后方第n n个数据个数据的地址。的地址。2022-6-320 例6.4 通过指针的间接访问,输出下标为偶数的数组元素的值。#include using namespace std;void main() int k110=11,24,37,44,58,66,79,86,93,108,*k; k=&k10; for(int i=0;i10;i=i+2) coutk1
9、i=*(k+i) ; coutendl; 运行结果运行结果:K10=11 k12=37. 数组第一个元素(下标为数组第一个元素(下标为0)的地址赋值给指针)的地址赋值给指针k 每次循环,指针加每次循环,指针加2 22022-6-321 指针和指针的直接加法没有意义直接加法没有意义 指针和指针的减法可以减法可以进行-求出两个指针之间可以存放几个指定类型的数据 不允许用一个整数减一个指针 2022-6-322 同类型的指针可以可以进行关系运算 进行指针“大于”、“小于”的比较,是判定指针在内存中的相对位置 指针和一般的整数比较没有意义,也不允许惟一可以和指针比较的整数是0。判定指针是不是空指针 2
10、022-6-323 void类型的指针就是“无类型”指针: void *指针名; 存放的也是内存的地址,但不指定这个地址单元内的数据的类型 2022-6-324-任何指针都可以赋值给void指针 赋值后的void指针的类型仍然是void -void指针不可以赋值给其他任何类型的指针 -void指针不可通过间接引用访问内存中数据 -必须进行指针类型的强制转换,才可以使用指针间接引用访问内存数据 2022-6-325 例6.5 使用memcpy通用复制函数复制数组原型 void *memcpy(void *dest, const void*, size) #include using namesp
11、ace std; #include #include void main()void main() char src10=012345678; char src10=012345678; char dest10; char dest10; char char* * pc=(char pc=(char* *)memcpy(dest,src,10);)memcpy(dest,src,10); cout pc endl;cout pc endl; int s13=1,2,3; int s13=1,2,3; int d13; int d13; int int * *pi=(intpi=(int* *)
12、memcpy(d1,s1,12);)memcpy(d1,s1,12); coutcout* *pi pi * *(pi+1) (pi+1) * *(pi+2)endl;(pi+2)endl; 运行结果运行结果:0123456780123456781 2 3 复制字符数据,复制字符数据,1010个个字节字节复制整型数据,复制整型数据,1212个个字节字节2022-6-326 void类型指针应用:显示字符指针的内容其他指针直接用cout语句输出地址值而字符指针输出的是字符串 将字符指针强制转换为void指针cout语句输出便是地址值例:char *pch=Hello C+; coutpchend
13、l; cout(void*)pchendl; 2022-6-327 指针是地址int *p;p=&a;*p=100; b=*p+2;2022-6-3286.3 6.3 指针和函数指针和函数 2022-6-329 在程序设计中,指针有很多应用 其中之一就是作为函数的参数,形成了C+函数调用中的另一种调用方式:地址调用地址调用 2022-6-330 实现地址调用,必须满足以下条件: 函数的形式参数是指针变量形式参数是指针变量; 函数的实参数是内存的地址实参数是内存的地址(可以是数组名数组名、变量的地址变量的地址、用变量地址初始化的指针指针)形参指针类型和实参地址类型必须相同类型必须相同 2022-
14、6-331实参传递给形参的是内存的地址,所以形参指针指向实参变量 形参指针通过间接引用,直接访问实参直接访问实参变量变量 (包括改变实参变量的值)函数调用后,改变了实参,如果有多个实参,就可以有多个实参变量在函数调用中被修改 2022-6-332 例6.6 编写数据交换的函数。#includevoid Swap(int void Swap(int * *a, int a, int * *b);b);void main()void main() int x(5), y(10);int x(5), y(10); coutcout主函数变量的值:主函数变量的值: x=x y=yendl;x=x y=
15、yendl;Swap(&x,&y);Swap(&x,&y);coutcout返回后变量的值:返回后变量的值: x=x y=yendl;x=x y=yendl; void Swap(int void Swap(int * *a, int a, int * *b)b) int t;int t;t=t=* *a;a;* *a=a=* *b;b;* *b=t;b=t; cout cout函数中完成了交换:函数中完成了交换:* *a=a=* *a a * *b=b=* *bendl;bendl; 运行结果运行结果:主函数变量的值:主函数变量的值:x=5 y=10函数中完成了交换:函数中完成了交换:*a=
16、10 *b=5返回后变量的值:返回后变量的值: x=10 y=5 变量的地址作为实参数变量的地址作为实参数指针变量作为形式参数指针变量作为形式参数2022-6-333 变量x和y的地址作实参传递给指针a和b,如图(a) 通过间接引用*a和*b进行交换,实际上就是x和y进行交换,如图(b) 2022-6-334 例6.7 指针变量指向一个数组 #includeusing namespace std;void Move(int void Move(int * *a);a);void main()void main() int x5=10,20,30,40,50, int x5=10,20,30,4
17、0,50, * *px=x;px=x;coutcout调用前的调用前的* *px=px=* *pxendl;pxendl; Move(px);Move(px);coutcout调用后的调用后的px;px;if(px=x)coutif(px=x)cout没有变化,没有变化,* *pxpx还是还是* *pxendl;pxendl;else coutelse cout也向前移动,也向前移动,* *pxpx变为变为* *pxendl;pxendl; void Move(int void Move(int * *a)a) a=a+1; a=a+1; * *a=100;a=100; cout cout“函
18、数中完成了指针函数中完成了指针移动:移动:* *a=a=* *aendl;aendl; 运行结果运行结果:调用前的调用前的*px=10 函数中完成了指针移动:函数中完成了指针移动:*a=20 调用后的调用后的pxpx没有变化没有变化*px还是还是10 指针作为实参数指针作为实参数指针变量作为形式参数指针变量作为形式参数2022-6-335 通过数组名地址调用,可以可以改变实参数组内容 但有时并不需要改变数组的值 例如,在调用一个求数组最大值的函数时,就不希望数组的值发生变化 希望在函数中能够限制对数组元素的修改 使用常指针可以达到这个目的 2022-6-336 常指针常指针是指向常量的指针(P
19、ointer to Constant data) 规定指针所指向的内容不可以通过指针的规定指针所指向的内容不可以通过指针的间接引用来改变间接引用来改变。 常指针说明的格式是: const 类型名 *指针名; 例如: const int *ptint; 指针ptint的类型是(const int *),即指向一个恒定的整型数 2022-6-337 例6.10 常指针示例。观察以下程序的运行。 #include using namespace std;void main()void main()int ia=10, ib=20;int ia=10, ib=20;const int const in
20、t * *ptint; ptint; ptint=&ia;ptint=&ia; / /用用ia ia地址初始化地址初始化coutcout* *ptintendl;ptintendl;ptint=&ib;ptint=&ib; / /改变为改变为ib ib的地址的地址ib=ib+100;ib=ib+100; /ib/ib本身仍然可以改变本身仍然可以改变coutcout* *ptintendl;ptintendl;/ / * *ptint=100;ptint=100; / /语句错误:左值是常量语句错误:左值是常量 运行结果运行结果:10 120 常指针声明常指针声明注释去掉会出现编译错误注释去掉会
21、出现编译错误2022-6-338 指针常量指针常量(Pointer constant)指针本身是常量指针本身是常量(地址是常量地址是常量),不可以改变指针常量声明的格式: 类型名类型名 *const 指针名指针名=初值初值; char ch, *const ptch=&ch; 数组名是数组的首地址-数组名是指针常量 2022-6-339 例6.11 指针常量示例。指出以下程序的错误。 #include using namespace std;void main() int a=10, b=100; int int * *const pa=&a;const pa=&a;/pa是指针常量 cout
22、*paendl; * *pa=20;pa=20; /指针常量的间接引用是允许的 coutaendl; pa=&b; const int c=50; int *const pc=&c; 错误语句注错误语句注释掉后运行释掉后运行结果结果:10 20 语句有错:常量不语句有错:常量不能当左值能当左值语句有错,地址语句有错,地址类型不同类型不同不能用常量地址不能用常量地址初始化指针常量初始化指针常量2022-6-340例6.12 用常指针作形参,函数printString可以输出数组的内容,不可以对数组修改。 #include using namespace std;void printString(
23、 const char void printString( const char * * ); );void main()void main() char phrase = C+ is a programming language; char phrase = C+ is a programming language; cout The string is:n; cout The string is:n; printString( phrase ); cout endl; printString( phrase ); cout endl; / main / main函数结束函数结束void p
24、rintString( const char void printString( const char * *Ptarray )Ptarray ) while( while(* *Ptarray) Ptarray) cout cout * *Ptarray+;Ptarray+; 不使用常指针也不使用常指针也是可以完成打印。是可以完成打印。但是没有保护了。但是没有保护了。数组名作实参数数组名作实参数常指针作形式参数常指针作形式参数2022-6-3416.4 6.4 指针和字符串指针和字符串 2022-6-342 字符串常量字符串常量:双引号括起,0结束 如:This is a string。 字
25、符串常量有自己固定的首地址 如果将字符串常量的首地址看成是指针,这种指针既是常指针,也是指针常量。 2022-6-343 处理字符串两种方式:数组方式数组方式和指针方式指针方式 数组方式数组方式是将字符串存入字符数组: char string_array =Whats a nice day!; 指针方式指针方式是用字符串常量来初始化一个字符指针: char *string_pt=Whats a nice day!; 2022-6-344指针常量不能指针常量不能放在等式左边放在等式左边运行时会出运行时会出错错2022-6-345实参数:字符数组名、已经初始化的字符指针,字符串常量实参数:字符数组
展开阅读全文