C++程序设计第6章 指针与引用教学课件.ppt
《C++程序设计第6章 指针与引用教学课件.ppt》由会员分享,可在线阅读,更多相关《C++程序设计第6章 指针与引用教学课件.ppt(34页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C+程序设计第6章 指针与引用教学课件C C语言程序设计案例教程语言程序设计案例教程语言程序设计案例教程语言程序设计案例教程第6章 指针与引用指针和引用是C+中的重要内容。灵活使用指针可以使程序简洁、高效。指针的内容相对较难,读者需要多实践,从代码中体会指针的精髓。引用在实现了指针部分功能的同时,简化了指针的用法,另外,引用也实现了一些特有的功能。http:/ 目录6.1 指针的概念6.2 指针与数组6.3 函数与指针6.4 指针与动态内存分配6.5 const与指针6.6 引用3http:/ 6.1 指针的概念指针:是C语言的精华,也是C+必不可少的组成部分,其高效性不言而喻。6.1.1 指
2、针与内存的关系计算机运行时数据都是存在内存中的。内存的存储单元以字节为单位,每一个单元都有其唯一的地址编号。变量在内存中的首地址称为该变量的指针。计算机以位(bit)为数据的最小存储单元。其中存数的数据类型为0或1。每8位为一字节(byte),常见的数据都是以字节为单位计算占用内存大小的。图6-1表示的就是数据在内存中的状态。4http:/ 图6-1 变量与内存当定义一个整型数据并为其赋值时,例如:intnum=8;实际上程序是在内存中开辟了相应的物理空间用于存放数据,而这段物理空间就有它的地址编号即内存地址。指针变量就是一种存储内存地址的数据类型,通过直接查找内存地址访问数据。6.1.2 定
3、义指针变量定义指针变量时必须确定该指针所指向的数据类型,以确定该指针的类型。一个类型的指针只能指向相应类型的数据。例如,char型指针只能指向char型对象。5http:/ 2)指针的定义)指针的定义风格风格1)指针变量的定义)指针变量的定义double型指针变量的定义通常有以下两种风格:double*num;double*num;在C+中,定义符号*来声明指针类型。例如:int*num;char*cha;double*dnum;int num1,*num2 /定义了int型变量num1和int型指针 num23)定义多个指针)定义多个指针定义多个指针一般有两种风格:一是参考上面推荐的定义风格
4、,多次定义来实现这一目的;二是一次性定义多个同类型指针。例如:double*num;/第一种风格double*num2;double*num,*num2;/第二种风格6http:/ 6.1.3 使用指针指向数据1)指向数据)指向数据指针是一种存储内存地址的数据类型。在C+中,定义符号&为取地址运算符。&a即为a的内存首地址。&只能运用于已经声明的变量,因为只有这种数据才会在内存中拥有自己的内存地址。至于该变量是否已经定义,则并不重要。例如:int num;int*point=#num=10;/这一串操作是合法的int num=10;int*point=#/这一串操作是合法的in
5、t*point=#int num=10;/这一串操作是非的指 针的指向和普通变量一样是可以重新定义的,通 过修改其存储的内存地址就可以实现.例如:int num1,num2;int*point;point=&num1;point=&num2;7http:/ 2)获取数据在C+中,定义符号*为间接访问运算符。其使用格式如下。*指针名;例如:intnum=10;int*point=#cout*pointendl;与指向数据类似,使用间接访问运算符时,指针必须有一个确定的指向。下面几种使用方法就是非法的。int*point;*point=10;/访问错误,没有给指针一个确定的指向in
6、t*point=NULL;/将该指针悬空,不指向任何数据*point=10;/访问错误,指针指向为空8http:/ using namespace std;int main()int num=10;int*point;/定义int型指针point,并未初始化 point=#/把num的地址赋给point,使point指向num cout*point endl;*point=20;/通过指针修改其指向的数据 cout point endl*point ends num endl;return 0;程序运行结果如图6-2所示。9http:/ 6.2 指针与数组数组:在内存中是连续存放的。这
7、种存放方式,使得指针对于数组数据的访问非常方便。从首地址开始逐个位移就可以遍历整个数组。6.2.1 指向数组的指针C+中规定,数组的数组名即代表数组的首地址,也就是“数组名0”的地址。intarray10;int*point=array;/array为数组名,即代表了数组的首地址int*point2=&array0;/该操作和上一条指令效果相同需要注意的是,对于不同的数组,需要以相应的指针指向数组。例如:intarray10;char*point=array;/错误,不可以使用char型指针指向int型数组char*point2=&array0;/错误,同上指针可以指向任意同类型数组的任意位置
8、。例如:intarray10;int*point=&array5;/指向数组中的第六个元素10http:/ 6.2.2 使用指针访问数组指针访问数组的常用方法是,定义某一指针指向数组的首地址,然后通过对指针的加减来访问数组的每一个元素。指针的加减是指针的常用操作。当对指针进行加一的操作时,C+会自动地按照该指针类型,判断在内存中向下跳多少内存空间。例如,当指针为int型时,对其加1,则会在内存中向下跳4字节。当指针为char型时,对其加1,则会在内存中向下跳1字节。由于数组在内存中是连续存放的,对于数组来说,指针的加减即为访问下一个或上一个数组元素。例如:intarray10=0,1,2,3,
9、4,5,6,7,8,9;int*point=array;cout*(point+1)endl;/这里输出的结果就是1,为第二个元素11http:/ 下面的例子完整地演示了指针在数组中的使用。【例6-2】指向数组的指针。#includeusingnamespacestd;intmain()intarray10;int*point=array;/定义point指向数组array首地址int*point2=&array0;/定义point2指向数组array首地址for(inti=0;i!=10;i+)/使用for循环语句为数组array赋值*point=i;point+;/每次赋值之后使point
10、指向下一个元素for(inti=0;i!=10;i+)/使用for循环语句输出数组arraycout*(point2+i)ends;return0;12http:/ 程序运行结果如图6-3所示。指向字符串的指针与指向数组的指针类似。字符串在内存中也是连续存放的,所不同的是字符串是以char型存放在内存中的。可以参考指向数组的指针的使用方法。例如:6.2.3 指向字符串的指针chararray12=helloworld;char*point=array;/类似于指向数组的指针下面通过指向字符串的指针来实现复制char数组的功能。【例6-3】指针实现的char数组复制。#includeusingn
11、amespacestd;intmain()charcha115,cha215;strcpy(cha1,helloworld!);/对于char数组的赋值的一种方法char*point_char=cha1;/定义char型指针指向cha1inti;for(i=0;*point_char!=0;i+,point_char+)cha2i=*point_char;cha2i=0;/手动的添加字符串结束符coutcha1endlcha2endl;return0;13http:/ 程序运行结果如图6-4所示。【例6-3】中有一些细节需要注意,首先是对于char数组的赋值,通常有3种方法。(1)在声明的时候
12、初始化。例如:charcha15=helloworld;(2)使用strcpy函数。例如:charcha;strcpy(cha,helloworld);(3)对char数组的每个字符分别赋值。例如:chara10=h,e,l,l,o;【例6-3】中手动为cha2添加了0这一字符串结束符,目的在于使其完整。cout以0判断字符串是否结束。14http:/ 6.3 函数与指针函数有其地址,指向函数的指针即为函数指针。相对于直接使用函数名调用函数,函数指针除了在可读性上稍差一些,其他方面有诸多优势。6.3.1 函数地址函数在计算机中运行时会占用一定的内存。因此,函数是有地址的。将指针指向该函数的入口
13、地址,即定义了函数指针。通过函数指针同样可以调用函数,达到相应的目的。6.3.2 定义函数指针定义指向一个返回类型为int,拥有两个int型形参的函数的函数指针:int(*point_function)(int,int);看到这种相对复杂的定义方法时,先寻找变量名,找到point_function。通过其左边的“*”判断其为指针型变量。通过其右边的(int,int)判断其为指向函数的指针,且其指向的函数的形参为两个int型参数。需要注意的是,声明函数指针时,(*point_funciont)中的()是不能省略的.因为括号的优先级高,所以声明的才是指针变量而不是返回类型为指针的函数。15http
14、:/ 14典型的例子如下。典型的例子如下。void(*point_function)();/声明一个函数指针void*point_function();/声明一个函数熟悉函数指针的定义规则,就可以读懂一些复杂的定义和声明。例如:int(*(*point_function)(int,int)(int);定义了一个指向函数的指针point_function,该函数有两个int型形参,返回一个函数指针。返回的函数指针指向的函数有一个int型形参,返回一个int型数据。typedef double(*(*(*point_function)(int,int)10)();point_function po
15、int1;使用typedef可以简化这种复杂的定义方法。这里首先定义了一种数据类型point_function。这是一个函数指针,指向的函数有两个int型形参。返回一个指针,指向含有10个函数指针的指针数组。这些函数不接受参数且返回类型为double。第二行中定义了一个这种类型的数据point1。http:/ 6.3.3 使用函数指针调用函数一旦定义了函数指针,在使用之前就一定要为其赋上函数的地址。类似于用数组名代表数组的地址,函数名也代表函数的地址。由此可以按照如下方法为函数指针赋值。intfunction(inta,intb);int(*point_function)(int,int);p
16、oint=function/通过函数名来为函数指针赋值也可以在定义时就将其初始化:voidfunction();void(*point_function)()=function;/在声明时就将其初始化【例6-4】使用函数指针调用函数。#includeusingnamespacestd;intmain()inta,b;intfunction(inta,intb);/声明一个函数int(*point)(int,int);/声明一个函数指针point=function;/使函数指针指向指定函数cinab;point(a,b);15http:/ cout-endl;int(*point_functio
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+程序设计第6章 指针与引用教学课件 C+ 程序设计 指针 引用 教学 课件
限制150内