资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,第,8,章,指针和引用,8.1.1,指针的概念,指针:一个变量的地址,一个内存单元的地址。,变量的地址:该变量所占存储单元的首地址。,变量的值:内存单元中的内容。,变量地址的表示:,&,变量名。,&,:取地址运算符。,指针变量:专门存放变量地址的变量。,8.1.2,指针变量的说明,指针变量与其他类型的变量一样,必须先说明后使用,,说明格式为:,存储类型,类型变量名,1,变量名,2,;,其中,存储类型是可任选的;变量名前的星号指明所说明,的变量为指针变量;而类型则指出指针变量所指向的数据类,型。,1.,指针的类型,从语法的角度看,只要把指针声明语句里的指针名字去,掉,剩下的部分就是这个指针的类型。,2.,指针所指向的数据类型,当通过指针来访问指针所指向的内存区域时,指针所指,向的类型决定数据类型。,了编译器将把那片内存区里的内容当做什么来看待。,8.2.1,指针的赋值运算,指针赋值运算常见的形式如下。,(1),将一个变量的地址以,&,运算的结果形式赋给,一个同类型的指针。,(2),将另一同类型的指针值赋给某一指针,(3),在,C+,中可以将,0,赋给任一指针变量,其含义,是初始化指针变量,使其值为,“,空,”,。,例,8-1,指针的赋值运算,例,8-2,指针的赋值运算,例,8-3,指针的赋值运算,8.2.2,指针的算术运算,左值所能进行的算术运算有两种:一是指针变量与一个,整数的加或减运算;二是自增、自减运算。,1.,与整数的加或减运算,如果指针变量的定义为,datatype*p;p,初始地址值为,DS,那么,p+n=DS+n,sizeof(datatype),。,指针加法的单位是指针对应类型的字节数。,例,8-4,与整数的加或减运算,2.,指针的自增或自减,指针的自增或自减表示指针从当前位置向后或向前移动,sizeof(,数据类型,),长度的存储单元,指向下一个或上一个元素,例,8-5,指针的自增或自减,8.2.3,指针的关系运算,指针变量可以进行关系运算,两个指针变量的关系运算,是根据两个指针变量值的大小,(,作为无符号整数,),来进行比较,的,通常只有同类型的指针变量进行比较才有意义。,相等,(=),比较的含义是判断两个指针变量是否指向相同,的内存单元,即两个指针值是否相同;而不等比较,(,、,=),的含义是判断两个指针变量是否指向不同的内存单,元,在,C+,中,同一个符号可能表示不同的运算符。,编译器根据运算符的优先级、操作数的类型及个数来区,分的。,例,8-6,指针的关系运算,例,8-7,混合运算及其优先级,8.3,指针和数组,8.3.1,指针与一维数组,8.3.2,指针与多维数组,8.3.3,指针和字符串,8.3.1,指针与一维数组,如图,8.3,所示,定义一个数组,a10,和一个指针,pa,。,int a 10,*pa;,pa=a;/A,pa=/B,A,、,B,行的效果是一样的,都,是把数组的首地址赋给指针。,引用一个数组元素,有,3,种方法:,(1),下标法:,ai,。,(2),数组名地址法:*,(a+i),。,(3),指针法:,指针地址法:*,(pa+i),指针下标法:,pai,图,8.3,一维数组与指针示意图,例,8-8,一维数组与指针,8.3.2,指针与多维数组,在,C+,中,二维数组的各个元,素值按行的顺序在一片连续的内存,空间中存放。,行数组首地址,a,,相当于,&a0,。,行元素,ai,即为*,(a+i),,实际,为各列数组首地址。,各列数组首地址,ai,,相当于,&ai0,。,列元素地址,&aij,,可用,ai+j,或者*,(a+i)+j,表示。,图,8.4,所示为二维数组与指针,的关系示意图。,图,8.4,二维数组与指针关系示意图,例,8-9,二维数组与指针,例,8-10,用指针变量输出二维数组,8.3.3,指针和字符串,用字符指针表示字符串有,3,种方法:,(1),指向字符数组,让字符指针与存放字符串的,字符数组关联,就可以用字符指针表示该字符串。,(2),直接定义指针并初始化,让它指向指定的字,符串。,(3),直接将字符串常量赋予字符指针,例,8-11,指针与字符串,8.4,指针数组和多级指针,8.4.1,指针数组,8.4.2,指向一维数组的指针变量,8.4.3,多级指针,8.4.1,指针数组,指针数组是指针变量的集合,它的每一个元素都是一个,指针,且具有相同的数据类型。其一般的定义格式为:,存储类型,*,;,数据类型是指针所指向变量的数据类型。因为,“,”,的,优先级高于,“,*,”,,指针,与,构成一个,数组,再与*结合,指明是一个指针数组,数据类型指明指,针数组中每个元素所指变量的类型。,例,8-13,指针数组输出,例,8-14,将字符串降序后输出,8.4.2,指向一维数组的指针变量,可以声明一个指针变量使其只能指向一维数组,声明的,格式为:,要注意这样两种写法:,int*p4;/,定义了一个指针数组,该数组有,4,个指针元素,int(*p)4;/,定义了一个指针,该指针指向一个有,4,个元素的数组,因为运算符,的优先级高于*,所以用圆括号,(),将*与,指针变量名括起来以改变运算符的优先级顺序,使*先作用,于指针变量,然后再与,结合,形成指向一维数组的指针,变量。,例,8-15,指向一维数组的指针变量,8.4.3,多级指针,如果指针变量中存放的是另一个指针的地址,,就称该指针变量为指向指针的指针变量。,指向指针的指针变量也称为二级指针。其声明,的语法格式为:,*,两个符号*表示后面声明的变量为指向指针的指针,变量。,例,8-16,通过多级指针访问指针数组元素,例,8-17,多级指针的简单应用,8.5,指针和函数,8.5.1,指针作为函数的参数,8.5.2,返回指针的函数,8.5.3,指向函数的指针,8.5.4,带参数的,main(),函数,8.5.1,指针作为函数的参数,当形参为指针时,实参可以是一个基类型相同的指针变,量或变量的地址。当函数的参数为指针时,可将指针值和指,针所指向的数据作为函数的输入参数,即在函数体内可使用,指针值和指针所指向的数据值。也可将指针所指向的数据作,为函数的输出参数,即在函数体内改变了形参指针所指向的,数据值,调用函数后,实参指针所指向的数据也随之改变。,例,8-18,用值传递和地址传递实现两个数据的交换,例,8-19,形参为指针、实参为数组名和指针,例,8-20,形参为数组名,实参为数组名和指针,8.5.2,返回指针的函数,函数的返回值可以为整型、实型、双精度型、字符型数,据,也可以为指针,返回指针值的函数的定义方法如下:,类型说明符 *函数名,(,参量表列,),函数体,其中类型说明符为函数返回的指针指向的数据类型。,例,8-21,返回指针的函数,例,8-22,利用函数求两个一维数组对应元素之和,8.5.3,指向函数的指针,编译器为每个函数确定一个入口地址,当调用该函数时,,系统会从这个,“,入口地址,”,开始执行函数。存放函数的入口,地址的指针就是一个指向函数的指针,简称为函数指针。定,义函数指针的格式为:,(*)();,注意在定义指向函数的指针变量假设为,p,时,,(*p),两,侧的括号不可省略,表示,p,先与*结合,它是指针变量,然,后再与后面的,(),结合,表示此指针变量指向函数;否则将与,返回指针的函数相混淆。,8.5.3,指向函数的指针,例,8-23,指向函数的指针,例,8-24,用指向函数的指针实现比较大小的运算,例,8-25,从任意类型的数组中找出最大元素,8.5.4,带参数的,main(),函数,为执行一个可执行文件而在操作系统提示符下输入的命,令叫命令行。,命令行一般语法形式:,命令名 参数,1,参数,2.,参数,n,带参数的,main(),函数形式:,main(int argc,char *argv),.,形参名任意,习惯上使用,argc,和,argv,,其中,argc,为命令,行中参数的个数,(,包括可执行文件名,),,而,argv,为一字符指针,数组,元素个数随命令行参数而定,每个指针数组元素都指,向命令行中的一个参数。,例,8-26,带参数的,main(),函数,8.6 new,和,delete,运算符,8.6.1 new,和,delete,运算符的用法,8.6.2,使用,new,和,delete,运算符的注意事项,8.6.1 new,和,delete,运算符的用法,1.new,操作符的使用,C+,提供了操作符,new,和,new,来创建动态变量。,(1)new,用来动态创建单个变量。语法格式为:,new,(2),可以在申请内存空间时,同时对该内存空间初始化。,(3)new,用来创建动态变量数组,语法格式为:,2.delete,操作符的使用,(1)delete ,。释放,所指向的内,存空间。对应上面的第一点,释放时用语句:,delete p;/,释放,p,所指向的内存空间,(2)delete,或者,delete ,例,8-27,动态实现内存分配和撤销,8.6.2,使用,new,和,delete,运算符的注意事项,两个运算符,应注意以下几点。,(1),用,new,运算符分配的存储空间,其初值是不确定的。,(2),用,new,运算符分配空间后,要判断指针的值是否为,0,。若为,0,,表示动态分配内存失败。,(3),定义一个指针,动态分配数组时,不能对数组进行初始化。,(4),当,new,运算符计算的指针类型与赋值运算符左操作数类型不一致时,必须进行强制类型装换。,(5),用,new,运算符分配的内存空间,该指针不能随意指向别的空间;否则,当指针已不再指向用,new,运算符分配的内存空间时,,delete,会出错。,(6),不需要时一定要及时归还给操作系统,让操作系统能够分配给其他需要内存的指针。,8.7,引用和其他类型的指针,8.7.1,引用类型变量的说明和使用,8.7.2,函数的引用传递,8.7.3 const,类型变量,8.7.4 void,型指针,8.7.1,引用类型变量的说明和使用,在,C+,中引入引用类型的主要目的是为了在函数的参数,传递时提供方便。,引用类型主要用作函数的参数或用作函数的返回值类型。,定义一个引用类型变量的一般格式为:,&=,int a;,int,定义了一个引用类型的变量,aa,,它是变量,a,的别名。,例,8-28,利用类型变量的使用示例,8.7.2,函数的引用传递,1.,引用作为函数的参数,引用可以作为函数的参数,建立函数参数的引用传递方,式。传递引用实际上传递的是变量的地址,这一点与指针是,一样的,但是这种传递方式避免了传递大量数据带来的额外,空间开销,从而节省大量存储空间,减少了程序运行的时间。,2.,函数的返回值为引用类型,当函数的返回值为引用类型时,它的返回值一定是某一,个变量的别名。,例,8-29,函数的引用传递,例,8-30,函数的返回值为引用类型,8.7.3 const,类型变量,1.,定义,const,型常量,const int DeadLine=365;,const float A=1.00009;,用,const,定义的标识符常量时,一定要对其初始化。,2.const,型指针,const,是一个左结合的类型修饰符,用于指针的有以下几种情况。,(1),将,const,放在指针变量的类型的前面:,const,int*A;,表示指针变量,A,可变,指针所指向的数据*,A,不可变。,(2),将,const,放在指针变量的*的后面:,int*const A;,表示指针,A,不可变,但指针变量所指向的数据*,A,可变,在定义时必须赋初值。,(3),将一个,const,放在指针变量的类型的前面,将另一个,const,放在指针变量的*的后面:,const,int*const A;/,表示指针变量所指向的值是一个常量,即指针,A,可变,指针所指向的数据也是一个常量,*,A,也不可变。在定义
展开阅读全文