C++程序设计:第7章 指针

上传人:cl****1 文档编号:569938098 上传时间:2024-07-31 格式:PPT 页数:134 大小:1.80MB
返回 下载 相关 举报
C++程序设计:第7章 指针_第1页
第1页 / 共134页
C++程序设计:第7章 指针_第2页
第2页 / 共134页
C++程序设计:第7章 指针_第3页
第3页 / 共134页
C++程序设计:第7章 指针_第4页
第4页 / 共134页
C++程序设计:第7章 指针_第5页
第5页 / 共134页
点击查看更多>>
资源描述

《C++程序设计:第7章 指针》由会员分享,可在线阅读,更多相关《C++程序设计:第7章 指针(134页珍藏版)》请在金锄头文库上搜索。

1、voidmain(void)floats10=90,95,88,70,65,86,74,80,92,84;floataver=ave(s,10);cout“aver=“avern;floatave(floata,intn)inti;floatsum=a0;for(i=1;in;i+)sum=sum+ai;returnsum/10;floatave(float*a,intn)inti;floatsum=a0;for(i=1;iii; ; 实际上是按实际上是按地址地址地址地址将输入将输入直接直接直接直接放到定义放到定义 i i 单元中。单元中。i2 2、间接访问、间接访问将变量的地址存放在另一个单

2、元将变量的地址存放在另一个单元p p中中,通过,通过 p p 取出取出变量的地址,再针对变量操作。变量的地址,再针对变量操作。i2000H2000H3000Hpp=&i;cin*p;指针的概念指针的概念一个变量的地址称为该变量的指针。一个变量的地址称为该变量的指针。如果在程序中定义了一个变量或数组,那么,这个变如果在程序中定义了一个变量或数组,那么,这个变量或数组的地址(指针)也就确定为一个量或数组的地址(指针)也就确定为一个常量常量。变量的变量的指针指针和指向变量的和指向变量的指针变量指针变量变量的指针就是变量的指针就是变量的地址变量的地址,当变量定义后,其当变量定义后,其指针(地址)是一指

3、针(地址)是一常量常量。 int i; &i :2000H 可以可以定义一个变量定义一个变量专门用来专门用来存放存放另一变量的另一变量的地地址址,这种变量称之为,这种变量称之为指针变量指针变量。在编译时同样分配一。在编译时同样分配一定字节的存储单元,未赋初值时,该存储单元内的值定字节的存储单元,未赋初值时,该存储单元内的值是是随机随机的。的。2000Hi7.2.1指针变量的定义指针变量的定义指针变量定义的一般形式为:指针变量定义的一般形式为:类型标识符类型标识符 * *变量名变量名int *i_point;指针类型指针类型变量名变量名指针指针变量变量同样也可以赋值:同样也可以赋值:int i;

4、int *i_point=&i;3000H i_point2000H i2000H运算符运算符*和指针变量和指针变量一个指针变量只能指向一个指针变量只能指向同一类型同一类型的变量的变量。即整。即整型指针变量只能放整型数据的地址,而不能放型指针变量只能放整型数据的地址,而不能放其它类型数据的地址。其它类型数据的地址。&运算符表示运算符表示“地址地址”。 * * 在在定义语句定义语句中只表示变量的类型是指针,中只表示变量的类型是指针,没有任何其它意义。没有任何其它意义。intint *p=&a *p=&a * * 和指针变量结合表示和指针变量结合表示“指向指向”,表示对指针,表示对指针变量指向的内

5、存单元变量指向的内存单元(变量变量)进行读进行读/写操作写操作。* *p=3 p=3 2000H3000H point*point=5;表示表示指向指向表示表示类型类型i2000H5int i;int *point=&i;指针和指向指针和指向指针变量只能指向和其同类型的变量,指针变量只能指向和其同类型的变量,不能指向其它类型的变量,也不能指向常不能指向其它类型的变量,也不能指向常量和表达式。量和表达式。C+允许将一个常量经允许将一个常量经强制类强制类型转换型转换后赋值给指针变量。后赋值给指针变量。int*p=(int*)0x2000;/初始化指针变量初始化指针变量p,使其值为,使其值为0x20

6、00float*f=(float*)100;/初始化指针变量初始化指针变量f,使其值为,使其值为100如果在定义指针变量时没有初始化,其值如果在定义指针变量时没有初始化,其值是随机的、不确定的(静态存储类型、文是随机的、不确定的(静态存储类型、文件作用域类型的除外件作用域类型的除外,=0)。)。例例:定义指针变量,使其指向另一个变量。定义指针变量,使其指向另一个变量。inti,*p;/指针指针p的值是随机的的值是随机的p=&i;/指针赋值,使其指向变量指针赋值,使其指向变量ip p指向不确指向不确定,不能用定,不能用例:例:通过指针变量,输入通过指针变量,输入/输出数据。输出数据。#inclu

7、devoidmain(void)inta,b,*p1,*p2;p1=&a;p2=&b; /指针指针p1指向指向a,p2指向指向bcin*p1*p2; /通过指针为变量通过指针为变量a、b输入输入coutatbendl;/直接输出直接输出a、bcout*p1t*p2ab;/输入输入a、bp1=&a;p2=&b; /p1、p2分别指向分别指向a、bif(ab)p=p1;p1=p2;p2=p;/交换指针交换指针p1与与p2的指向的指向coutatbendl;cout*p1t*p2endl;bp1p2a&a&b48bp1a&a&b4p28交换前交换前交换后交换后对于指针变量,系统也为其分配地址,同样可

8、对于指针变量,系统也为其分配地址,同样可以定义一个变量来存放其地址。以定义一个变量来存放其地址。intx,*p1,*p2;p1=&x;p2=&p1;二级指针变量的定义和赋初值方法如下:二级指针变量的定义和赋初值方法如下:*=初值初值;p2p1x&p1&x可以缺省可以缺省7.2.3多级指针多级指针在在+语言中,把这种指针型变量称为语言中,把这种指针型变量称为“指针的指针指针的指针”,意为这种变量是指向指,意为这种变量是指向指针变量的指针变量,也称针变量的指针变量,也称多级指针多级指针。通常使用的多级指针是通常使用的多级指针是二级指针二级指针,相对,相对来说,前面介绍的指针变量可以称为来说,前面介

9、绍的指针变量可以称为“一一级指针级指针”。int *ptr=&i, *pptr=&ptr;但是:但是:pptr=&i; pptr=ptr;则:则: *ptr相当于相当于i *ptr=5相当于相当于i=5 *pptr也相当于也相当于i *pptr=8相当于相当于i=8 *pptr相当于相当于ptr *pptr=&i相当于相当于ptr=&i非法非法,基类基类型不符型不符设有:设有:7.3.1指针与一维数组指针与一维数组一级指针与一维数组的关系十分密切。一级指针与一维数组的关系十分密切。指向一维数组的指针变量,实际上是指向指向一维数组的指针变量,实际上是指向一维数组元素的指针变量。可以利用指向一维数

10、组元素的指针变量。可以利用指向一维数组的指针变量,完成对数组数据的一维数组的指针变量,完成对数组数据的操作处理。操作处理。inta5,*p,*p1;p=a;p1=&a0p指向指向ap1指向指向a0inta10,*p;p=&a4;/指针指针p指向数组指向数组a的元素的元素a4*p=4;/*p=4等同于等同于a4=4a+;/错误错误,数组名不能赋值数组名不能赋值p+;/正确正确,p指向指向a5数组名为一常指针,数组名为一常指针,不能赋值和修改不能赋值和修改 说明一个指针变量说明一个指针变量( (注意类型要与数组元素注意类型要与数组元素相同相同) )并使之指向数组的某个元素,则可以使并使之指向数组的

11、某个元素,则可以使用该指针变量来操作数组。用该指针变量来操作数组。 intint a10,b10; a10,b10; intint * *ptraptra,*,*ptrbptrb; ; ptraptra=&a0; =&a0; ptrbptrb=b; =b; 由于指针使用的灵活性由于指针使用的灵活性, ,可以在一个数组可以在一个数组定义后再用指针对数组进行处理。定义后再用指针对数组进行处理。 例例: :用指针访问数组用指针访问数组.cpp总结总结( (对一维数组对一维数组):):1)1)数组名等同于数组第数组名等同于数组第0 0个元素的地址,也个元素的地址,也就是数组的起始地址就是数组的起始地址

12、, ,相当于一个常指针相当于一个常指针。2)2)指针指向数组的首地址后,其值指针指向数组的首地址后,其值+i+i后指向后指向数组的第数组的第i i个元素。个元素。3)3)指针指向数组指针指向数组a a的首地址后的首地址后, ,可以用指针代可以用指针代替数组名使用替数组名使用,*(point+i),*(point+i)、* *(a+i)(a+i)、aiai、pointipointi、* *aiai、* *pointipointi等同等同, ,都是都是表示一维数组的第表示一维数组的第i i个元素。个元素。 若若pointpoint指向指向a2, a2, *(point+i)表示什么表示什么?指针变

13、量的运算主要有三种:指针变量的运算主要有三种:赋值赋值运算、运算、算术算术运算和运算和关系关系运算。运算。1.赋值运算赋值运算inta,*pa;pa=&a;把一个变量的地址赋予指向相同数据类型的指针把一个变量的地址赋予指向相同数据类型的指针变量。变量。inta,*pa=&a,*pb;pb=pa;相同类型指针赋值,把变量相同类型指针赋值,把变量a的地址赋予指针变的地址赋予指针变量量pb7.3.2指针的运算指针的运算同类型指针赋值的含义是什么同类型指针赋值的含义是什么?char*ptr;ptr=Iloveyou!;把字符串的首地址赋予指针变量把字符串的首地址赋予指针变量char*str;cin.g

14、etline(str);/错误错误指针变量指针变量str未赋值,指向不确定未赋值,指向不确定可以对指针变量赋可以对指针变量赋0值。指针变量赋值。指针变量赋0值值后称为后称为空指针空指针,空指针不指向任何地方。,空指针不指向任何地方。int*p=0; /p不指向任何地方不指向任何地方或或int*p=NULL; /p不指向任何地方不指向任何地方NULLNULL相当于相当于0 0指针指针#define NULL 0#define NULL 02.指针的算术运算指针的算术运算inta5,*pa;pa=a; /pa指向数组指向数组a,也就是指向,也就是指向a0pa=pa+2;/pa指向指向a2,即,即p

15、a的值为的值为&pa2一般的,在一般的,在指针指向一个数组后指针指向一个数组后,指针加减,指针加减一个整数的算术运算才有实际意义。指针变一个整数的算术运算才有实际意义。指针变量加减一个整数量加减一个整数n的含义是将指针指向的位的含义是将指针指向的位置向前或向后置向前或向后移动移动n个元素个元素。指针偏移指针偏移一般的,当有了定义一般的,当有了定义“inta10,*p=a;”后,有:后,有:*(p+1)=2;/p+1为为a1地址地址*(a+1)=2;/a+1为为a1地址地址*+p=2;/+p为为a1地址地址p=p+1;*p=2;/p=p+1与与+p等价等价a1=2;/直接对数组元素赋值直接对数组

16、元素赋值p1=2;/指针名作数组名用指针名作数组名用这些行是等价的,都是使这些行是等价的,都是使a1为为2。intc=7,b=5,a=3,*p=&a;/设设&a=2000H357a2000Hb2004Hc2008Hp 2000H则有则有(*(*运算符是左结合的运算符是左结合的) ):(*p)+;(*p)+; / /相当于相当于a+a+。表达式为。表达式为3,a=4,p3,a=4,p不变不变 *p+;*p+; / / *p+*p+首先首先* *p p ,然后,然后p=p+1,p=p+1,指针指向指针指向b b, /表达式为表达式为3, p3, p2004H,a2004H,a不变不变 +*p+*p

17、 / /相当于相当于+(*p)+(*p),就是,就是* *p=*p+1p=*p+1,即,即a=4a=4 *+p*+p / /相当于相当于* *(+p)(+p),首先:,首先:p=p+1,p=p+1,然后取然后取* *p p。 /即即p p先指向先指向b b,再取,再取b b的内容。表达式为的内容。表达式为5 5, /p p2004H2004H357a2000Hb2004Hc2008Hp 2000H(*p)+、+*p*p+、*+p4p 2004H357a2000Hb2004Hc2008Hp 2000H a注意进行算术运算的是指针本身还是指针指注意进行算术运算的是指针本身还是指针指向的对象向的对象

18、两个指针变量之间只能做两个指针变量之间只能做减法减法算术运算。只有算术运算。只有指向同一数组指向同一数组的两个指针变量之间的减法才有的两个指针变量之间的减法才有意义。两指针相减所得之差是两个指针所指数意义。两指针相减所得之差是两个指针所指数组元素之间相差的元素个数。组元素之间相差的元素个数。指针变量之间的加法和乘除法没有意义指针变量之间的加法和乘除法没有意义设有:设有:inta10,*p1,*p2;p1=&a2;p2=&a5;则:则:p2-p1的值为的值为3,就是,就是p2、p1所指数组所指数组元元素下标的差素下标的差。指向同一数组的两指针变量进行关系运算可指向同一数组的两指针变量进行关系运算

19、可表示它们所指数组元素之间的关系。表示它们所指数组元素之间的关系。设:设:inta10,*p1=&a0,*p2=&a5;则:则:p2p1值为真,因为值为真,因为p2的值大于的值大于p1的值。即的值。即&a5&a0p2=p1值为假,因为值为假,因为p1和和p2不是不是指向同一个变量指向同一个变量(值不同值不同)p1!=0值为真,因为值为真,因为p1指向了指向了a0,不是空指针。,不是空指针。3.指针的关系运算指针的关系运算例:例:使用指针处理数组使用指针处理数组voidmain(void)inta10,i;int*p;for(i=0;iai;for(p=a;p=a+9;p+)cout*pt;p=

20、ap=a使使p p指向数组指向数组a a;a+9a+9为一常指针,指向数组为一常指针,指向数组a a的最后一个元素,的最后一个元素,p=a+9p=a+9表示指针表示指针p p指向移动指向移动时,不能超出数组最后一个元素。时,不能超出数组最后一个元素。for(p=a;p=a+9;)cout*p=pe。过程如下图所示:过程如下图所示:16782345109a0a5a6a7a1a2a3a4a9a8pbpe交换交换交换交换* * * *pbpbpbpb、* * * *pepepepe101234567897.3.3指针与二维数组指针与二维数组二维数组是二维数组是“数组的数组数组的数组”,即二维数组,即

21、二维数组是由若干个是由若干个一维数组所组成一维数组所组成的。的。二维数组有三种地址:二维数组有三种地址:数组地址数组地址、行地址行地址和和元素地址元素地址。设有定义设有定义“inta34;”,则三种地址为:,则三种地址为:数组首地址:数组首地址:a行地址:行地址:a+0、a+1、a+2元素地址:元素地址:ai或或ai+j或或&aij等等inta34;/设数组设数组a的首地址是的首地址是2000Ha0a1a22000H2010H2020Ha00 a01 a02 a03a10 a11 a12 a13a20 a21 a22 a23a2000H 2004H 2008H 200CH 数组首地址是数组首地

22、址是2000H2000H,三个行地址分别是,三个行地址分别是2000H2000H、2010H2010H和和2020H2020H,各数组元素地址从,各数组元素地址从2000H2000H到到202CH202CH连续分布。连续分布。 a0、a1、a2为组成二维数组为组成二维数组a a的的3 3个个一维数组名字一维数组名字( (一维数组名是元素指针一维数组名是元素指针) )。 下下面面分分析析二二维维数数组组名名与与其其所所分分解解成成的的多多个一维数组名之间的关系。个一维数组名之间的关系。a=&a0;a=&a0;/0/0行地址行地址, ,& &区分为行地址区分为行地址a0=*a;a0=*a;/0/0

23、行行0 0列元素地址列元素地址, ,* *区分为元素地址区分为元素地址a+i=&ai; a+i=&ai; ai=*(ai=*(a+ia+i););一维数组名是一个元素指针一维数组名是一个元素指针二维数组名是一个行指针二维数组名是一个行指针ai : :表示第表示第i i行第行第0 0列元素的地址列元素的地址a+i : :表示第表示第i i行地址行地址( (偏移偏移i i行行) )&ai:表示第表示第i行地址行地址,&不表示取地址不表示取地址,用来区用来区分元素地址和行地址分元素地址和行地址.*(a+i):表示第表示第i行第行第0列元素的地址列元素的地址,*不表示不表示取内容取内容,用来区分元素地

24、址和行地址用来区分元素地址和行地址.元素指针元素指针ai前加前加&转换成行指针转换成行指针a+i=&ai行指针行指针(a+i)前加前加*转换成元素指针转换成元素指针*(a+i)=ai元素指针算术运算是偏移多少元素元素指针算术运算是偏移多少元素行指针算术运算是偏移多少行行指针算术运算是偏移多少行结合指针偏移的概念理解结合指针偏移的概念理解元素指针和行指针是不同的指针元素指针和行指针是不同的指针* *的的4 4种种作作用用: :乘乘、指指针针定定义义、取取内内容容、区区分分为为元元素素地址地址( (运算符运算符&)&)a00=*a0=*(*a);ai0=*ai=*(*(a+i);aij=*(ai+

25、j)=*(*(a+i)+j);&aij=ai+j=*(a+i)+j; 表示形式表示形式含义含义a数组名数组名,起始地址起始地址,0行地址行地址a+0第第0行行起始地址起始地址a0第第0行第行第0列列元素地址元素地址*a,*(a+0)第第0行第行第0列元素地址列元素地址*a,*(a+0),*a0,*(*(a+0)+0)元素元素a00a+i,&ai第第i行起始地址行起始地址a+i+j,&ai+j第第i+j行起始地址行起始地址ai,*(a+i)第第i行第行第0列元素地址列元素地址*(a+i)+j,ai+j,&aij,*&ai+j第第i行第行第j列元素地址列元素地址*(*(a+i)+j),*(ai+j

26、),*(&aij),*(*&ai+j),aij第第i行第行第j列元素列元素aIj二维数组地址和元素的表示法二维数组地址和元素的表示法使用二维数组名、指向运算符和取地址使用二维数组名、指向运算符和取地址运算符,二维数组元素有着多种表示方法,运算符,二维数组元素有着多种表示方法,例如例如(优先级优先级()*):*(a+1)+2=&a12*(*(a+1)+2)=a12*(a+1)=*(a1)=*(&a10)=a10(*(a+1)1=(a1)1=c1=a11/c=a1*(a+1)1=*(a+1)1)=*(c1)=*(&c10)=c10=a20/c=a+1,行指针行指针例例:指针访问二维数组指针访问二维

27、数组.CPP7.3.4指针数组指针数组由由同类型指针同类型指针所组成的数组称为指针数组。或者当某所组成的数组称为指针数组。或者当某个数组被定义为指针类型,就称这样的数组为指针数个数组被定义为指针类型,就称这样的数组为指针数组。组。指针数组的每个元素都是一个指针变量指针数组的每个元素都是一个指针变量。定义指针数组的一般格式为:定义指针数组的一般格式为:*;可以给指针数组赋初值,赋初值有多种方式,同普可以给指针数组赋初值,赋初值有多种方式,同普通的数组。通的数组。定义指针变量时的定义指针变量时的数据类型数据类型可以选取任何基本数可以选取任何基本数据类型,也可以是结构体类型、枚举类型或类类型。据类型

28、,也可以是结构体类型、枚举类型或类类型。设有:设有:“inta,b,c,*p3=&a,&b,&c;”,数组名数组名指针个数指针个数初始化地初始化地址址 b a c&a &b &cp定义一整型数组和指针数组,通过指针数组来输定义一整型数组和指针数组,通过指针数组来输出整型数组。出整型数组。voidmain(void)inta=10,20,30,40,50,60;int*p=&a0,&a1,&a2,&a3,&a4,&a5;/初始化指针数组,每个指针数组元素指向一个初始化指针数组,每个指针数组元素指向一个实型数组元素实型数组元素for(inti=0;i6;i+)cout*pit; /*pi就是就是a

29、icoutendl;输出结果:输出结果:10 20 30 40 50 6010 20 30 40 50 60voidmain(void)a5=1,3,5,7,9,*pa5,*p=pa,i;for(i=0;i5;i+)pai=&ai;cout*pt;p+;97531a&a4&a3&a2&a1&a0papapp=p+1;p=p+1;指向指向papa数组下一个元素数组下一个元素13579p=&pai指针数组的首地址是一个二级指针指针数组的首地址是一个二级指针例例:指针数组指针数组.cpp7.3.5指向二维数组的指针指向二维数组的指针一维数组名是一个一级指针,二维数组名呢?一维数组名是一个一级指针,二

30、维数组名呢?二维数组名不能赋值给一级指针和二级指针二维数组名不能赋值给一级指针和二级指针对于一个对于一个m列的二维数组列的二维数组aNM,可以定义一个,可以定义一个指向它的指针:指向它的指针:“int(*p)M;”。就可以赋值:。就可以赋值:“p=a;”。这里的指针。这里的指针p称为称为“指向数组的指针指向数组的指针”。定义指向数组的指针的一般形式为:定义指向数组的指针的一般形式为:(*)指向二维数组的指针可以用来代替二维数组名指向二维数组的指针可以用来代替二维数组名使用指向二维数组的指针输出二维数组中的使用指向二维数组的指针输出二维数组中的元素。元素。voidmain()inta34=0,1

31、,2,3,4,5,6,7,8,9,10,11;int(*p)4,i,j;p=a;/指针指针p指向二维数组指向二维数组a(起始地址)(起始地址)for(i=0;i3;i+)/使用相对于使用相对于a数组起始地址的偏移量数组起始地址的偏移量for(j=0;j4;j+)/用指针用指针+偏移量生成临时指针偏移量生成临时指针cout*(*(p+i)+j)t;/使用行指针使用行指针p+偏移量偏移量cout*(pi+j)t; /使用列指针使用列指针pi+偏移量偏移量cout*(*(a+i)+j)t;/使用行指针使用行指针a+偏移量偏移量cout*(ai+j)n; /使用列指针使用列指针ai+偏移量偏移量指向二

32、维数组的指针.cpp7.4指针与函数指针与函数在在C+中,指针与函数的关系密切而复杂。中,指针与函数的关系密切而复杂。与数组名一样,与数组名一样,函数名函数名也是一个常指针。函数也是一个常指针。函数的的参数参数可以是指针,函数的可以是指针,函数的返回值返回值也可以是指也可以是指针。还可以定义针。还可以定义指向函数指向函数的指针。的指针。指针作函数参数,形参要求是指针变量,实指针作函数参数,形参要求是指针变量,实参要求分为以下几种情况。参要求分为以下几种情况。实参为数组名实参为数组名实参为地址实参为地址实参为指针实参为指针一、实参用数组名,形参用指针变量一、实参用数组名,形参用指针变量voidm

33、ain(void)inta10;.f(a,10);.f(int*x,intn).实参数组实参数组形参指针形参指针7.4.1指针作为函数参数指针作为函数参数#defineN10/选择排序选择排序voidsele_sort(int*p)/形参为指针形参为指针,指向实参数组,指向实参数组inti,j,k,temp;for(i=0;iN-1;i+)k=i;/设左端点元素值最小,记下其下标设左端点元素值最小,记下其下标ifor(j=i+1;jN;j+)/与最小元素与最小元素ak比较比较if(pjpk)k=j;/记下较小元素下标记下较小元素下标jif(k!=i)/最小元素和左端点元素交换最小元素和左端点元

34、素交换 temp=pi;pi=pk;pk=temp;指针名作数组名用指针名作数组名用数组方式排序数组方式排序voidmain()intaN,i;cout请输入请输入N个整数:个整数:n;for(i=0;iai;sele_sort(a);/数组名作实参调用排序函数数组名作实参调用排序函数cout排序后的数据为:排序后的数据为:n;for(i=0;iN;i+) /输出排序后的数组输出排序后的数组coutait;coutn;voidsele_sort(int*p)/形参为指针形参为指针,指向实参数组,指向实参数组inttemp,*p1,*p2,*p3;for(p1=p;p1p+N-1;p1+)p3=

35、p1;/p3指向左端点,假设这个元素最小指向左端点,假设这个元素最小for(p2=p1+1;p2p+N;p2+)/p2指向的元素与最小元素比较指向的元素与最小元素比较if(*p2ab;if(ab)swap(&a,&b);coutatbb)swap(&a,&b);/主调,传地址主调,传地址voidswap(int*p1,int*p2)/被调被调通过形参指针,交换实参变量通过形参指针,交换实参变量主调函数主调函数被调函数被调函数ap2p14&b&b&a&ab9三、实参形参均为指针变量三、实参形参均为指针变量voidmain(void)inta10,*p;p=a;.f(p,10);.f(int*x,

36、intn).实参指针实参指针形参指针形参指针实参指针变量调用前必须赋值实参指针变量调用前必须赋值接收的是接收的是地址的值地址的值例:输入例:输入10个整数,将其中最小的数与第一个数对个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。换,把最大的数与最后一个数对换。voidexchang(int*p,intn)/指针作形参指针作形参inti,j=0,k=0,t;for(i=0;ipj)j=i;/j为最大值位置为最大值位置if(pipk)k=i;/k为最小值位置为最小值位置if(k!=0)t=p0;p0=pk;pk=t;/交换最小值和交换最小值和p0if(j!=n-1)t=pn-1

37、;pn-1=pj;pj=t;/交换最大值和交换最大值和pn-1voidmain()inta10=4,3,5,7,2,6,1,9,8,0,*pa,i;pa=a;exchang(pa,10);for(i=0;i10;i+)coutait;coutn;指针在作实参指针在作实参前必须赋值!前必须赋值!在函数调用时,实参传递给形参的是实参指针的在函数调用时,实参传递给形参的是实参指针的值,为值,为传值方式传值方式。在被调函数中对形参指针的任。在被调函数中对形参指针的任何修改都不会影响实参指针的值何修改都不会影响实参指针的值(但可能影响实参但可能影响实参指针指向的对象指针指向的对象)。调用后,实参指针和形

38、参指针调用后,实参指针和形参指针指向同一对象。指向同一对象。利用指针作函数参数实现数据的利用指针作函数参数实现数据的双向传递双向传递不是指不是指指针参数本身,而是指指针参数本身,而是指隐藏在指针后面隐藏在指针后面的的指针指指针指向变量向变量,指针参数本身依然是单向传值。,指针参数本身依然是单向传值。传址本质上还是传值,只是被调函数获得了主调传址本质上还是传值,只是被调函数获得了主调函数中的一个指针。函数中的一个指针。7.4.2返回值为指针的函数返回值为指针的函数返回指针值的函数简称为返回指针值的函数简称为指针函数指针函数。定义指针函数的一般形式为:定义指针函数的一般形式为:*();例如例如:i

39、nt*a(intx,inty);表示返回值表示返回值为指针为指针函数名函数名参数与一般参数与一般函数一样函数一样使用函数求两个变量的最大值。使用函数求两个变量的最大值。#includevoidmain()inta,b,*pmax;int*max(int*,int*);coutab;pmax=max(&a,&b);coutmax=*pmax*b?a:b;returnp;/返回指针返回指针p p例:设有一结构体,包含学号、姓名和年龄,例:设有一结构体,包含学号、姓名和年龄,用返回值为指针的函数完成结构体数据输入。用返回值为指针的函数完成结构体数据输入。分析:本程序应定义一个结构体类型分析:本程序应

40、定义一个结构体类型student,包括三个成员。程序由,包括三个成员。程序由2个函数组个函数组成:输入函数和主函数。成:输入函数和主函数。student*input();/输入函数,返回指针输入函数,返回指针;主函数负责定义变量、调用输入函数,输主函数负责定义变量、调用输入函数,输出结构体变量中的数据。出结构体变量中的数据。structstudent/定义结构体类型定义结构体类型intnum;charname20;intage;stu;/定义结构体变量定义结构体变量stustudent*input()/返回值指针指向结构体变量返回值指针指向结构体变量student*ps=&stu;/结构体指针

41、指向全局变量结构体指针指向全局变量coutps-numps-nameps-age;returnps; /返回的指针不能指向局部变量返回的指针不能指向局部变量主调函数中要主调函数中要能访问能访问psps指向指向的变量的变量voidmain()student*p;p=input();/input返回指针返回指针cout学号:学号:num,姓名:,姓名:name,年龄:,年龄:agen;函数所返回的指针必须是指向一个在函数所返回的指针必须是指向一个在主主调函数中可以访问的变量调函数中可以访问的变量。不能是指向被。不能是指向被调函数中的局部变量。否则,引用返回的调函数中的局部变量。否则,引用返回的指针

42、就不能得到正确的结果。指针就不能得到正确的结果。7.4.3指向函数的指针指向函数的指针函数虽然不是变量,但是它在内存中占有一函数虽然不是变量,但是它在内存中占有一定的空间。函数的首地址就是该函数的入口地址,定的空间。函数的首地址就是该函数的入口地址,它可以赋给指针变量,使得指针变量指向函数,它可以赋给指针变量,使得指针变量指向函数,指向函数的指针简称为指向函数的指针简称为函数指针函数指针。函数指针可以用如下形式说明:函数指针可以用如下形式说明:(*指针变量名)(指针变量名)(););例如:例如:int(*p)(int,int);指向函数,函数要符合条件指向函数,函数要符合条件函数值为整函数值为

43、整形指针形指针函数要有两函数要有两个整形参数个整形参数定义指针定义指针引用指向函数的指针调用函数完成加法。引用指向函数的指针调用函数完成加法。intfunc(inta,intb)returna+b;voidmain()int(*p)(inta,intb);/该函数返回值为整型,有两个整型参数该函数返回值为整型,有两个整型参数 p=func;/使指针指向函数使指针指向函数 cout(*p)(100,200)n;/调用函数调用函数程序运行结果:程序运行结果:300指向函数的指针指向函数的指针指向函数的指针指向的是一种特定函数,指向函数的指针指向的是一种特定函数,引用时,该指针所指向函数的引用时,该

44、指针所指向函数的返回值类型、返回值类型、参数个数、参数类型以及顺序参数个数、参数类型以及顺序,须与定义,须与定义指针时一致。指针时一致。函数指针可以作为函数的参数函数指针可以作为函数的参数intf1(inta)/整型函数整型函数f1,要求,要求1个整型实参个整型实参intf2(inta,intb)/整型函数整型函数f2,要求,要求2个整型实参个整型实参voidfunc(int(*p1)(int),int(*p2)(int,int)/函数有两个形参,均为指向函数的指针函数有两个形参,均为指向函数的指针inta,b,i,j;a=(*p1)(i);/调用函数调用函数f1,i作实参作实参b=(*p2)

45、(i,j);/调用函数调用函数f2,i、j作实参作实参voidmain()func(f1,f2)/将函数名将函数名f1,f2传递给传递给func函数函数函数指针应用函数指针应用1.求定积分求定积分2.牛顿切线法求解方程根牛顿切线法求解方程根7.5const指针指针使用使用const定义的指针称为定义的指针称为常指针常指针(或指针常量),(或指针常量),常指针有三种情况常指针有三种情况:1一般格式为一般格式为(最常用最常用):const*=const放在放在*左边,表示指针指向的内存的内容不可左边,表示指针指向的内存的内容不可通过指针来修改通过指针来修改!inta,b;constint*p=a;

46、*p=5;/错误,不能通过错误,不能通过p修改修改a的值的值a=10;/正确,正确,a可修改可修改p=&b;/正确正确p可改指可改指*p=5;/错误错误,不能通过不能通过p修改修改b的值的值常用作函数参数,禁止在被调函数中修改指针指向常用作函数参数,禁止在被调函数中修改指针指向的对象的对象p为常指针为常指针第二种第二种const指针,其一般格式为:指针,其一般格式为:*const=这种类型的指针定义中,这种类型的指针定义中,const在在*和变量名和变量名之间,表示指针变量的指向不可以改变之间,表示指针变量的指向不可以改变!例如:例如:intnum=0,k;int*constp=#/p

47、指向指向num*p=5; /正确,可以修改正确,可以修改num的值的值p=&k;/错误,错误,p不能改指向其它变量不能改指向其它变量第三种第三种const指针,其一般格式为:指针,其一般格式为:const*const=这种这种const指针是前两种的结合指针是前两种的结合,使得指向的内使得指向的内容和地址都不能发生变化。容和地址都不能发生变化。例如:例如:doublepi=3.14159;constdouble*constptr=π这时,既不能这时,既不能通过通过ptr修改修改pi的值,也不能改的值,也不能改变常指针变常指针ptr的指向的指向。这种类型的指针较少使。这种类型的指针较少使用

48、。用。使用使用const将大大改善程序的健壮性。将大大改善程序的健壮性。另外另外const的一些强大的功能在于它在函数的一些强大的功能在于它在函数声明中的应用。声明中的应用。在一个函数声明中,在一个函数声明中,const可以修饰函数的返回值,或某个参数;对于可以修饰函数的返回值,或某个参数;对于类的成员函数,还可以修饰整个函数。类的成员函数,还可以修饰整个函数。voidfun(constchar*s1);/s1为常指针为常指针voidfun1()const;/类成员函数类成员函数fun1()为常函数为常函数,不允许在其中修改类的数据成员不允许在其中修改类的数据成员constintfun2();

49、 /常返回值常返回值,不能被修改不能被修改7.6 void型指针表示该指针可以指向任意类型的数据表示该指针可以指向任意类型的数据无类型指针无类型指针任何类型的指针都可以赋给它任何类型的指针都可以赋给它若将它赋给其他类型指针若将它赋给其他类型指针,需进行强制类型转换需进行强制类型转换.int a,*pi=&a; void *p1=pi; int *pi2=(int*)p1;不能直接进行算术运算不能直接进行算术运算charpc10;void*p=pc;p+;/unknownsize常用作函数的指针参数,编写通用程序常用作函数的指针参数,编写通用程序7.7指针与字符串指针与字符串字符串可以用字符串可

50、以用字符数组字符数组表示。借助字符数表示。借助字符数组和字符串处理函数,可以很好的存储和组和字符串处理函数,可以很好的存储和处理字符串。处理字符串。存储和处理字符串还可以存储和处理字符串还可以用指针用指针,使用指,使用指针比用字符数组处理字符串更容易。针比用字符数组处理字符串更容易。用字符指针处理字符串。用字符指针处理字符串。char*str=“Iamastudent”;/取内存中字符串常量首地址取内存中字符串常量首地址coutstrn;str=”Ilovechina!”coutstrn;strI a m a s t u d e n0tI l o v e c h i n a ! 0输出输出:I

51、amastudentIlovechina!用字符指针处理字符串。用字符指针处理字符串。char*str=“Iamastudent”,*p=str;coutstrn;/整体输出整体输出strwhile(*p)cout*p+;/逐个字符输出逐个字符输出strcoutn;for(inti=0;istrlen(str);i+)/输出输出strcout*(str+i);coutn;*p*p代表一个字符代表一个字符*(str+i)代表代表一个字符一个字符StrStr为一串字符,为一串字符,* *p p为一个字符为一个字符0将字符串将字符串a复制到字符串复制到字符串b。voidmain(void)chara

52、=“Iamastudent”,b20;char*p1=a,*p2=b;while(*p2+=*p1+);/逐字符复制逐字符复制coutatcoutbendl;I a m a s t u d e n0t p1p2*p2+=*p1+Ia mep1p1p1p1p1p1p1p1p1p1p1p1p1p1p2p2p2p2p2p2p2p2p2p2p2p2p2p2asutdn t例:输入例:输入5个字符串,从中找出最大的字符个字符串,从中找出最大的字符串并输出。要求用二维字符数组存放这串并输出。要求用二维字符数组存放这5个个字符串,用指针数组元素分别指向这字符串,用指针数组元素分别指向这5个字个字符串,用一个

53、二级指针变量指向这个指针符串,用一个二级指针变量指向这个指针数组。数组。分析:分析:本例处理的是字符串,需要用到本例处理的是字符串,需要用到字符串处理函数中的字符串输入、字符串字符串处理函数中的字符串输入、字符串输出、字符串比较等标准函数。输出、字符串比较等标准函数。程序中要含有一行:程序中要含有一行:#includevoidmain()chara580,*p5,*q,*max;inti;for(i=0;i5;i+)/pi指向指向a的第的第i行行pi=ai;/ai是第是第i行的首地址行的首地址for(i=0;i5;i+)cin.getline(pi,80);/输入输入5个字符串存入字符数组个字

54、符串存入字符数组aFortranC+PascalBasicFoxprop0p1p2p3p4a2a1a4a3a0max=&p0;/设当前最大字符串是字符组中第设当前最大字符串是字符组中第1行行q=&p1;/让二级指针变量让二级指针变量q指向指针数组第指向指针数组第2行行for(i=1;i5;i+,q+)if(strcmp(*max,*q)0)max=q;/*如果当前最大字符串小于二级指针如果当前最大字符串小于二级指针q指向指向的指针数组元素指向的字符串的指针数组元素指向的字符串,则重新记录最则重新记录最大字符串大字符串*/cout*max*qi=2,max=&a0,q=&a2,*max*qi=4

55、,max=&a2,q=&a4,*max*q*max=a2=“Pascal”FortranC+PascalBasicFoxprop0p1p2p3p4a2a1a4a3a0maxqmaxqqq例:将例:将5个计算机语言名字符串按字母顺序个计算机语言名字符串按字母顺序升序排序并输出。升序排序并输出。分析:定义一个有分析:定义一个有5个元素的字符个元素的字符指针数组指针数组c,初始化使其指向,初始化使其指向5个字符串。个字符串。再使用再使用2个个二级字符指针二级字符指针,指向数组,指向数组c的的元素。接下来使用元素。接下来使用“选择排序选择排序”法对其排法对其排序。和对数字数组排序一样。序。和对数字数组

56、排序一样。voidmain(void)char*c=Forth,Basic,Java,C+,Pascal;char*temp,*p1,*p2;/二级指针二级指针p1用作外层变量用作外层变量,p2用作内层变量用作内层变量for(p1=&c0;p1&c4;p1+)for(p2=p1+1;p20)/交换前后指针所指字符串交换前后指针所指字符串temp=*p1;*p1=*p2;*p2=temp;for(inti=0;i5;i+)coutciendl;输出结果:输出结果:BasicC+ForthJavaPascalc0c1c2c3c4ForthBasicJavaC+Pascalc0c1c2c3c4For

57、thBasicJavaC+Pascal排排序序前前排排序序后后以下程序判断输入的字符串是否以下程序判断输入的字符串是否“回文回文”,若是回文,输出,若是回文,输出YESYES。voidmain(void)chars81,*pi,*pj;intn;cin.getline(s);n=strlen(s);pi=s;pj=_;/pi指向串开始,指向串开始,pj指向最后指向最后while(*pi=)pi+;/跳过前导空格跳过前导空格while(*pj=)_;while(_)&(*pi=*pj)pi+;_;if()cout“NO”endl;elsecout“YESn”;pipjs+n-1pj-pj-pit

58、;/设输入为设输入为efun(st,t);coutstrendl;voidfun(char*s,charc)inti=0,j=0;for(;si!=0;i+)if(si!=c)sj+=si;sj=0;return;输出输出:tachr必须以必须以00结束结束teacher0stsijijirjiajiicji0当当si等于字符等于字符c c时,时,i i前进,前进,j j不动不动hjic et et指针形式小结指针形式小结intint i i, * *ipip, f()f(), * *fpfp()(), (*fp1)()(*fp1)(), *(*fp2)()*(*fp2)();intint a

59、5 a5, *ap5*ap5, (*pa)5(*pa)5, *(*fap5)()*(*fap5)();i一个整型变量*ip一个整型指针变量f()一个返回整型值的函数说明*fp()一个返回整型指针的函数说明(*fp1)()一个函数指针变量,函数返回整型值*(*fp2)()一个函数指针,函数返回一个整型指针a5五个整型元素数组*ap5五个整型指针数组(*pa)5指向二维数组(列数为5)的指针*(*fap5)()一个指针数组,该数组的每个元素都是指向函数的指针,而所指向的函数的返回值是整型指针引用引用引引用用是是某某一一变量量(目目标)的的一一个个别名名,对引用的操作与引用的操作与对变量直接操作完全

60、一量直接操作完全一样。定定义引用的一般格式:引用的一般格式: & = ;“目目标变量量名名”必必须是是已已经定定义过的的变量量或或引引用用。符符号号“& &”在在不不同同的的场合合有有不不同同的的含含义。在在数数据据声声明明时( (如如int&a) ),“&”意意为引引用用,若若“&”前前无无类型型符符,则是是取取变量量的的地地址址( (如如inta,*p=&a) )。使用引用使用引用时须注意以下几点:注意以下几点:1 1引引用用一一定定要要在在定定义的的时候候初初始始化化,而而且且初初始始化化值不能是一个常数。不能是一个常数。int&ref; /错误,定,定义引用没有初始化引用没有初始化in

61、t&ref=10;/错误,不能定,不能定义常量的引用常量的引用int&ref=n;/正确,定正确,定义时指定指定refref是是n n的引用的引用2 2对引用的操作就是引用的操作就是对被引用的被引用的变量的操作。量的操作。 例如:例如:intx,&a=x;a=5;coutx;/输出出为5 53 3引引用用同同变量量一一样有有地地址址,可可以以对其其地地址址进行操作,即将其地址行操作,即将其地址赋给一指一指针。 int*p,r,&ra=a;/变量、指量、指针和引用和引用p=&ra;/指针指向引用指针指向引用( (就是指向变量就是指向变量a)a)4 4可可以以用用动态分分配配的的内内存存空空间来来

62、初初始始化化一一个个引用引用变量。量。int&ra=*newint;/引用引用用用new的空的空间这里里的的“* *”是是必必须的的,因因为初初始始化化引引用用需需要要的的是是变量名,而量名,而newnew返回的是指返回的是指针。5设有:有:inti,j,a10,&r1=i;则有:有:int&r2=r1;/正确,定正确,定义引用的引用引用的引用int&r2=&r1;/错误,不能引用地址,不能引用地址int&re=&r1;/错误,不能定不能定义二二级引用引用&reint&r3=i;/正确,可以定正确,可以定义多个引用多个引用int&ra=a;/错误,不能定,不能定义数数组的引用的引用int&ra

63、10=a;/错误,不能定,不能定义引用数引用数组int&r2=a2;/正确,定正确,定义数数组元素的引用元素的引用引引用用有有两两个个主主要要用用途途:作作为为函函数数参参数数以以及及从从函数中返回左值函数中返回左值。例:定义函数交换两变量,引用作函数参数。例:定义函数交换两变量,引用作函数参数。intswap(int&x,int&y)/形参形参x,y为引用为引用intt;t=x;x=y;y=z;/交换形参就是交换实参交换形参就是交换实参a和和bvoidmain(void)inta=10,b=5;swap(a,b);/实参为变量实参为变量coutatbendl;输出结果:输出结果:5 5101

64、0返回值是引用的函数。返回值是引用的函数。inta10;int&ref(intn)/返回引用,函数名可作返回引用,函数名可作左值左值 returnan;voidmain() ref(5)=10;/函数值作左值,对函数值作左值,对a5a5赋值赋值coutn;float*p=newfloatn;7.9.1new运算符运算符使用使用new在堆上申请空间在堆上申请空间int*p1=newint;/p1指向指向new申请的空间申请的空间float*p2=newfloat(3.14);/p2指向指向new申请的空间,初始化为申请的空间,初始化为3.14char*p3=newchar20;/用用p3指向在堆

65、上申请的字符数组指向在堆上申请的字符数组int(*p4)5=newint35;/用用p4指向在堆上申请的指向在堆上申请的3行行5列的二维数组列的二维数组int&ref=*newint;/申请堆空间来初始化引用申请堆空间来初始化引用例:设计一程序,实现动态内存分配。例:设计一程序,实现动态内存分配。voidmain() intn,*p1,*p2;float(*p3)10;p1=newint10;/申请固定大小数组申请固定大小数组coutn;p2=newintn;/申请动态数组申请动态数组p3=newfloat510;/申请动态二维数组申请动态二维数组p3=newfloatn10;/申请动态二维数

66、组申请动态二维数组用用newnew运运算算符符申申请请的的堆堆空空间间没没有有名名字字,只只能能用用指指针针指指向向其其首首地地址址或或使使用用引引用用。在在申申请请的的空空间间释释放放以以前前,该该指指针针不不能能再再指指向向其其它它地址,以防内存泄露。地址,以防内存泄露。当当没没有有足足够够的的堆堆空空间间用用于于分分配配时时,newnew运运算算符返回符返回空指针空指针NULLNULL。delete运算符用于将申请的动态存储空间还给系统。运算符用于将申请的动态存储空间还给系统。delete指针指针;delete指针指针;/一维动态数组一维动态数组delete表达式表达式指针指针;/二维动

67、态数组二维动态数组deletenp;7.9.2delete运算符运算符delete运运算算符符的的功功能能是是用用来来释释放放(删删除除)使使用用new在在堆堆上上申申请请的的空空间间,将将申申请请的的空空间间归归还还给给系统。系统。释放释放new申请的堆空间。申请的堆空间。int*ptr1;ptr=newint(5);/ptr指向申请堆空间指向申请堆空间deleteptr;/释放指针释放指针ptr指向的堆空间指向的堆空间int&ref=*newint;/将指针转换为引用将指针转换为引用delete&ref;/释释放放引引用用堆堆空空间间时时要要加加“&”号号申请一维数组堆空间并释放之。申请一

68、维数组堆空间并释放之。int*p;p=newint10;/p指向申请数组堆空间指向申请数组堆空间deletep;/释放释放p指向的数组指向的数组关于关于delete运算符,须注意:运算符,须注意:(1)必须使用由运算符必须使用由运算符new返回的指针;返回的指针;(2)该运算符也适用于空指针;该运算符也适用于空指针;(3)指指针针名名前前只只用用一一对对方方括括号号符符,并并且且不不管管所所释释放放数数组组的的维维数数。如如果果释释放放的的是是多多维维数数组组,方括号内数字表示该数组第方括号内数字表示该数组第1维的大小。维的大小。newnew、deletedelete注意事项注意事项用用new

69、运算符分配的内存空间的指针必须保存起来,运算符分配的内存空间的指针必须保存起来,以便用以便用delete归还已分配的内存空间归还已分配的内存空间,否则会导致内存否则会导致内存泄漏泄漏.float*fp,i;fp=newfloat;*fp=24.5;fp=&i;deletefp;/没有指向动态分配的空间没有指向动态分配的空间newnew、deletedelete注意事项注意事项delete释放一个指针释放一个指针(内存空间内存空间)后,不返回任何值,后,不返回任何值,释放之后,指针值无意义,不能再对指针指向的内存释放之后,指针值无意义,不能再对指针指向的内存空间赋值空间赋值float*p=new

70、float;*p=3.2;deletep;*p=3.5;/p的指向不确定的指向不确定动态内存分配应用动态内存分配应用动态二维数组动态二维数组(m行行n列列)1)首先建立长度为首先建立长度为m的指针数组的指针数组,用二级指针用二级指针指向指向2)为指针数组中每个指针申请长度为为指针数组中每个指针申请长度为n的一维的一维数组数组3)释放指针数组中每个指针指向的内存释放指针数组中每个指针指向的内存4)释放指针数组释放指针数组指针使用常见错误指针使用常见错误由于通过指针可以由于通过指针可以直接对内存寻址直接对内存寻址,所以指针操作具有,所以指针操作具有灵活高效的特点,但如果指针使用不当,则会造成难以想

71、灵活高效的特点,但如果指针使用不当,则会造成难以想象的结果。象的结果。常见的有以下几种错误:常见的有以下几种错误:定义指针变量后定义指针变量后,未赋给它一个地址值就使用该指针变未赋给它一个地址值就使用该指针变量。量。int*p;*p=125;定义一个整型指针定义一个整型指针,即意味着分配给该指针变量一个内存即意味着分配给该指针变量一个内存区区,其中存放的值必须是另一个整型量的地址其中存放的值必须是另一个整型量的地址.正确的用法是:正确的用法是:int*p;p=newint(125);同样同样,删除一个未赋值的指针删除一个未赋值的指针也是危险的。也是危险的。int*p; deletep;指针使用

72、常见错误指针悬挂指针悬挂问题。问题。int*p1,*p2;p1=newint(98);p2=newint(99);p1=p2;deletep1;deletep2;由由于于p1=p2使使p1和和p2指指向向同同一一个个整整型型量量存存储储区区,经经过过上上述述操操作作后后,p1原原来来所所指指的的空空间间就就无无法法再再用用,甚甚至至无无法法回回收收,此就是所谓的指针悬挂此就是所谓的指针悬挂 (内存泄漏内存泄漏)P1P29899指针使用常见错误指针使用常见错误字符串字符串的赋值。的赋值。charstr=C+Language;char*ps;ps=newchar13;ps=str;/指针赋值导致内

73、存泄漏指针赋值导致内存泄漏deleteps;/释放的是释放的是str上面的第三句不起任何作用,因为第四句用字符串上面的第三句不起任何作用,因为第四句用字符串str的存的存储首地址重新为储首地址重新为ps赋值。赋值。应该使用:应该使用:strcpy(ps,str)指针使用常见错误返回指针返回指针(或返回引用或返回引用)的函数要避免函数返回后引用对象已不的函数要避免函数返回后引用对象已不存在的情况。存在的情况。int*fun()intj=5;return&j;函数返回后,自动变量函数返回后,自动变量j已不存在,返回自动变量的地址是不正确已不存在,返回自动变量的地址是不正确的。的。intj;/全局变

74、量全局变量int*fun()return&j;或或int*fun()staticintj=5;return&j;/静态变量静态变量或或int*fun()int*j=newint(5);returnj;/动态分配的内存地动态分配的内存地址址7.10链表链表链表由一个链表由一个头指针头指针和一组和一组结点结点组成,各个结组成,各个结点的类型相同,是一个结构体类型的变量。点的类型相同,是一个结构体类型的变量。结点由两类成员构成:数据成员和链接指针结点由两类成员构成:数据成员和链接指针成员。结点只有一个链接指针,就称链表为成员。结点只有一个链接指针,就称链表为单单向链表向链表。有两个链接指针,就称为。

75、有两个链接指针,就称为双向链表双向链表。链表中的链表中的结点用结点用new从堆上申请从堆上申请。用一组。用一组函函数数处理链表,至少要有两个函数以处理链表,至少要有两个函数以创建创建和和释放释放链表。链表。链表可以是链表可以是无序无序的,也可以是的,也可以是有序有序的。的。3000H2500HC2500HNULLD6000HA2000H6000H3000HB2000Hhead 头指针头指针指向链表的指向链表的第一个结点第一个结点,链表的最后一个结,链表的最后一个结点称为点称为链尾结点链尾结点,链尾结点的,链尾结点的指针值为指针值为NULLNULL,表示此,表示此链表结束。链表结束。 struc

76、tNodeintdata;Node*link;链表的基本操作包括链表的基本操作包括: : 1) 1)建立链表建立链表 2)2)向链表中插入节点向链表中插入节点 3)3)从链表中查找一个节点从链表中查找一个节点 4)4)从链表中删除一个节点从链表中删除一个节点 5)5)输出链表的所有数据输出链表的所有数据1.创建链表创建链表创建过程就是创建过程就是“插入插入”一个个结点的过程。有三种一个个结点的过程。有三种插入策略,分别是插到插入策略,分别是插到链尾链尾、链首链首和和链中链中。插在链。插在链中可以创建有序链表。本例中采用链尾插入方案。中可以创建有序链表。本例中采用链尾插入方案。设结点为:设结点为

77、:structNodeintdata;Node*link;函数原型为:函数原型为:Node*creat();创建链表的算法为:创建链表的算法为:1、定义空的头指针和尾指针,链表为空;定义空的头指针和尾指针,链表为空;2、输入一个数据,如果有效就申请一个结输入一个数据,如果有效就申请一个结点,数据存入结点。如果无效,创建结束,点,数据存入结点。如果无效,创建结束,返回头指针。返回头指针。如果是第一个结点,就用头指针指向它。如果是第一个结点,就用头指针指向它。尾指针也指向它;尾指针也指向它;如果不是第一个结点,就链接到链尾。如果不是第一个结点,就链接到链尾。该结点作新链尾;该结点作新链尾;3、回到

78、第回到第2步,循环进行,直到结束。步,循环进行,直到结束。Node*creat()Node*p1,*p2,*head=NULL;intid;coutid;while(id0)p1=newNode;p1-data=id;if(head=NULL)head=p1;headABCDNULLelsep2-link=p1;p2=p1;/新结点作新链尾新结点作新链尾coutid;/再输入数据再输入数据p2-link=NULL;returnhead;2.输出链表输出链表就是逐个结点的输出结点数据。就是逐个结点的输出结点数据。从头指针从头指针head出发,依次找到各个结点。出发,依次找到各个结点。函数原型为:

79、函数原型为:voidprint(Node*head);headA输出结果:输出结果:ABCDBCDNULL/输出链表(各结点数据)输出链表(各结点数据)voidprint(Node*head)while(head)coutdatalink;3.释放链表释放链表就是用就是用delete逐个释放结点。逐个释放结点。从头指针从头指针head出发,依次找到各个结点并删除之。出发,依次找到各个结点并删除之。函数原型为:函数原型为:voiddel(Node*head);headABCDNULL/删除一个链表删除一个链表voiddel(Node*head) Node*p;while(head)p=head-link;/保存下一结点指针保存下一结点指针deletehead;/释放当前结点释放当前结点head=p;/将下一结点作为当前结点将下一结点作为当前结点4.添加节点添加节点在在p1和和p2之间插入节点之间插入节点pp1-link=pp-link=p24.删除节点删除节点删除删除p1之后的节点之后的节点if(p1-link=NULL)return;p=p1-linkp1-link=p-linkdeletep;

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号