《第7章指针与引用.ppt》由会员分享,可在线阅读,更多相关《第7章指针与引用.ppt(43页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、7 7.1 .1 指针指针的声明和操作的声明和操作 7 7.2 2 指针与数组指针与数组7 7.3 3 指针与函数指针与函数7 7.4 4 动态内存分配动态内存分配 7 7.5 5 引用引用 第第第第7 7 7 7章:章:章:章:指针与引用指针与引用 指针是指针是指针是指针是保存内存地址的变量保存内存地址的变量保存内存地址的变量保存内存地址的变量,是,是,是,是C+C+C+C+语言从语言从语言从语言从C C C C语言中继承来的语言中继承来的语言中继承来的语言中继承来的重要概念,是重要概念,是重要概念,是重要概念,是C+C+C+C+语言最重要的特色之一。语言最重要的特色之一。语言最重要的特色之
2、一。语言最重要的特色之一。C+C+C+C+指针指针指针指针保存内存地址的功能保存内存地址的功能保存内存地址的功能保存内存地址的功能使得程序员可以直接管理计算使得程序员可以直接管理计算使得程序员可以直接管理计算使得程序员可以直接管理计算机内存。机内存。机内存。机内存。C+C+C+C+指针还可以用在指针还可以用在指针还可以用在指针还可以用在函数的传址调用函数的传址调用函数的传址调用函数的传址调用等场合,使得等场合,使得等场合,使得等场合,使得C+C+C+C+语言的语言的语言的语言的功能变得非常强大。功能变得非常强大。功能变得非常强大。功能变得非常强大。本章我们首先介绍指针的概念及其使用。同时,由于
3、引用是本章我们首先介绍指针的概念及其使用。同时,由于引用是本章我们首先介绍指针的概念及其使用。同时,由于引用是本章我们首先介绍指针的概念及其使用。同时,由于引用是C+C+C+C+语言引入的与指针密切相关的概念,本章也将作重点介绍。语言引入的与指针密切相关的概念,本章也将作重点介绍。语言引入的与指针密切相关的概念,本章也将作重点介绍。语言引入的与指针密切相关的概念,本章也将作重点介绍。7 7 7 7.1 .1 .1 .1 指针指针指针指针的声明和操作的声明和操作的声明和操作的声明和操作 数据在内存中的存储方式数据在内存中的存储方式数据在内存中的存储方式数据在内存中的存储方式是:按其所属的数据类型
4、,占据是:按其所属的数据类型,占据是:按其所属的数据类型,占据是:按其所属的数据类型,占据一定数量的连续内存单元。一定数量的连续内存单元。一定数量的连续内存单元。一定数量的连续内存单元。一个变量对应的内存空间可用其一个变量对应的内存空间可用其一个变量对应的内存空间可用其一个变量对应的内存空间可用其首地址首地址首地址首地址和和和和数据类型数据类型数据类型数据类型来唯一来唯一来唯一来唯一确定。确定。确定。确定。为了能像变量名那样来引用它所对应的内存空间,又能在为了能像变量名那样来引用它所对应的内存空间,又能在为了能像变量名那样来引用它所对应的内存空间,又能在为了能像变量名那样来引用它所对应的内存空
5、间,又能在程序中比较程序中比较程序中比较程序中比较随机地随机地随机地随机地访问其他的内存空间,访问其他的内存空间,访问其他的内存空间,访问其他的内存空间,c+c+引入了指针。引入了指针。引入了指针。引入了指针。为了能让指针访问不同的内存空间,指针本身存放的值必为了能让指针访问不同的内存空间,指针本身存放的值必为了能让指针访问不同的内存空间,指针本身存放的值必为了能让指针访问不同的内存空间,指针本身存放的值必须是不同的内存空间首地址。因此,须是不同的内存空间首地址。因此,须是不同的内存空间首地址。因此,须是不同的内存空间首地址。因此,指针必须是一个变量。指针必须是一个变量。指针必须是一个变量。指
6、针必须是一个变量。7 7 7 7.1.1 .1.1 .1.1 .1.1 数据存储数据存储数据存储数据存储 计算机内存划分为内存单元,这些内存单元按其顺序进行编址。在程序计算机内存划分为内存单元,这些内存单元按其顺序进行编址。在程序计算机内存划分为内存单元,这些内存单元按其顺序进行编址。在程序计算机内存划分为内存单元,这些内存单元按其顺序进行编址。在程序运行时,系统将利用内存存储相关的数据。运行时,系统将利用内存存储相关的数据。运行时,系统将利用内存存储相关的数据。运行时,系统将利用内存存储相关的数据。指针是用于存放内存地址的变量。可以将变量的地址保存在指针中,而无指针是用于存放内存地址的变量。
7、可以将变量的地址保存在指针中,而无指针是用于存放内存地址的变量。可以将变量的地址保存在指针中,而无指针是用于存放内存地址的变量。可以将变量的地址保存在指针中,而无需知道变量地址的实际数值。需知道变量地址的实际数值。需知道变量地址的实际数值。需知道变量地址的实际数值。列出的数据类型并不是指针变量本身的类型列出的数据类型并不是指针变量本身的类型列出的数据类型并不是指针变量本身的类型列出的数据类型并不是指针变量本身的类型,而是指针用于保存的地址值,而是指针用于保存的地址值,而是指针用于保存的地址值,而是指针用于保存的地址值中存储的变量的数据类型,即指针中存储的变量的数据类型,即指针中存储的变量的数据
8、类型,即指针中存储的变量的数据类型,即指针所指向变量的数据类型所指向变量的数据类型所指向变量的数据类型所指向变量的数据类型。指针是一个变量,必须指针是一个变量,必须指针是一个变量,必须指针是一个变量,必须先声明,后使用先声明,后使用先声明,后使用先声明,后使用。其声明的一般形式如下:。其声明的一般形式如下:。其声明的一般形式如下:。其声明的一般形式如下:数据类型数据类型数据类型数据类型 *标识符;标识符;标识符;标识符;标识符给出的是指针变量名。标识符给出的是指针变量名。标识符给出的是指针变量名。标识符给出的是指针变量名。“*”“*”号说明其后的变量是一个指针变量。号说明其后的变量是一个指针变
9、量。号说明其后的变量是一个指针变量。号说明其后的变量是一个指针变量。数据类型可以是数据类型可以是数据类型可以是数据类型可以是C+C+语语语语言中任一合法的类型。言中任一合法的类型。言中任一合法的类型。言中任一合法的类型。7.1.2 指针的声明及使用指针的声明及使用1.2 1.2 1.2 1.2 指针也可以和其他变量同时声明指针也可以和其他变量同时声明指针也可以和其他变量同时声明指针也可以和其他变量同时声明比如:比如:比如:比如:int i,*p1;int i,*p1;说明:声明了说明:声明了说明:声明了说明:声明了p1p1、p2p2两个指针。其中两个指针。其中两个指针。其中两个指针。其中p1p
10、1指向指向指向指向intint型变量,型变量,型变量,型变量,p2p2指向指向指向指向doubledouble型变量。型变量。型变量。型变量。比如:比如:比如:比如:int*p1;int*p1;double*p2;double*p2;说明:声明了一个说明:声明了一个说明:声明了一个说明:声明了一个intint型变量型变量型变量型变量i i和指针和指针和指针和指针p1p1。注:注:注:注:声明了一个指针后,在使用前必须首先给它赋一个合法的值。声明了一个指针后,在使用前必须首先给它赋一个合法的值。声明了一个指针后,在使用前必须首先给它赋一个合法的值。声明了一个指针后,在使用前必须首先给它赋一个合法
11、的值。否则,程序中对指针的使用就有可能导致系统崩溃。否则,程序中对指针的使用就有可能导致系统崩溃。否则,程序中对指针的使用就有可能导致系统崩溃。否则,程序中对指针的使用就有可能导致系统崩溃。1.1 1.1 1.1 1.1 对指针变量类型的声明对指针变量类型的声明对指针变量类型的声明对指针变量类型的声明1 1、指针的声明、指针的声明2.2 2.2 2.2 2.2 数组名表示的是该数组的首地址值,如果声明指针指向一个数组数组名表示的是该数组的首地址值,如果声明指针指向一个数组数组名表示的是该数组的首地址值,如果声明指针指向一个数组数组名表示的是该数组的首地址值,如果声明指针指向一个数组,则可以使用
12、下述赋值方法:则可以使用下述赋值方法:则可以使用下述赋值方法:则可以使用下述赋值方法:int xint x5 5,*px=x;,*px=x;把指针把指针把指针把指针pxpx初始化为指向数组初始化为指向数组初始化为指向数组初始化为指向数组int xint x5 5的的的的指针,即指针指针,即指针指针,即指针指针,即指针pxpx指向数组的第一个元素。指向数组的第一个元素。指向数组的第一个元素。指向数组的第一个元素。不需要使用取地址运算符不需要使用取地址运算符不需要使用取地址运算符不需要使用取地址运算符“&”“&”。等价等价等价等价int xint x5 5,px=&x,px=&x0 0;2.3 2
13、.3 2.3 2.3 如果如果如果如果需要用不同类型变量的地址给指针赋值,就应该采用需要用不同类型变量的地址给指针赋值,就应该采用需要用不同类型变量的地址给指针赋值,就应该采用需要用不同类型变量的地址给指针赋值,就应该采用强制类型转换。强制类型转换。强制类型转换。强制类型转换。例如:例如:例如:例如:double*p2=(double*)&i double*p2=(double*)&i 比如:比如:比如:比如:int i,*p1=&i;int i,*p1=&i;int*p2=0;int*p2=0;说明:第说明:第说明:第说明:第1 1个声明就将指针个声明就将指针个声明就将指针个声明就将指针p1
14、p1的值初始化为变的值初始化为变的值初始化为变的值初始化为变量量量量i i的内存地址;第的内存地址;第的内存地址;第的内存地址;第2 2个声明将指针个声明将指针个声明将指针个声明将指针p2p2的值初的值初的值初的值初始化为始化为始化为始化为0 0。值为值为值为值为0 0的指针叫空指针。的指针叫空指针。的指针叫空指针。的指针叫空指针。2.1 2.1 2.1 2.1 与其他变量一样与其他变量一样与其他变量一样与其他变量一样,我们可以在声明指针的同时,通过初始化给指针赋值。我们可以在声明指针的同时,通过初始化给指针赋值。我们可以在声明指针的同时,通过初始化给指针赋值。我们可以在声明指针的同时,通过初
15、始化给指针赋值。2 2、指针的赋值、指针的赋值3、指针的运算符3.1 运算符“&”功能:获取操作的对象指针。例如:int a5,i;则“&i”用来获取变量i的指针,它的值是i内存空间的首地址,类型为“int”3.2 运算符“”功能:引用指针所指向的内存空间注:当其作为左值时,则被引用的内存空间是可写的;当其作为右值时,则“引用”的操作是读取被引用的内存空间的值。例如:int p;.p=8;/A,写入 int a=p;/B,读取指针指针指针指针的算术运算主要是指的算术运算主要是指的算术运算主要是指的算术运算主要是指指针加上或减去一个整数值指针加上或减去一个整数值指针加上或减去一个整数值指针加上或
16、减去一个整数值,即,即,即,即+n +n -n-n意义:指针加减一个整数值意义:指针加减一个整数值意义:指针加减一个整数值意义:指针加减一个整数值n n,实际上是将指针的指向向上(减),实际上是将指针的指向向上(减),实际上是将指针的指向向上(减),实际上是将指针的指向向上(减)或向下(加)移动或向下(加)移动或向下(加)移动或向下(加)移动n n个位置,其结果仍是指针。个位置,其结果仍是指针。个位置,其结果仍是指针。个位置,其结果仍是指针。7.1.3 指针指针的算术的算术运算运算指针的数据类型决定了指针所指向的内存大小的空间,因此相邻指针的数据类型决定了指针所指向的内存大小的空间,因此相邻指
17、针的数据类型决定了指针所指向的内存大小的空间,因此相邻指针的数据类型决定了指针所指向的内存大小的空间,因此相邻两个两个两个两个指向的间距是指向的间距是指向的间距是指向的间距是“sizeof“sizeof(指针数据类型)(指针数据类型)(指针数据类型)(指针数据类型)”个内存单元。个内存单元。个内存单元。个内存单元。指针加指针加指针加指针加n n的实际操作的实际操作的实际操作的实际操作是使指针中的地址值加上是使指针中的地址值加上是使指针中的地址值加上是使指针中的地址值加上sizeof(sizeof(数据类型数据类型数据类型数据类型)*n)*n指针减指针减指针减指针减n n的实际操作的实际操作的实
18、际操作的实际操作是使指针中的地址值减去是使指针中的地址值减去是使指针中的地址值减去是使指针中的地址值减去sizeof(sizeof(数据类型数据类型数据类型数据类型)*n)*n7.1.4 const指针在在c+c+中,当用中,当用constconst关键字修饰指针时,可以限定指针的关键字修饰指针时,可以限定指针的指向指向和对和对内存空间内存空间内容的修改,即将它们设置成常量。内容的修改,即将它们设置成常量。1.限定内存空间的内容的改变限定内存空间的内容的改变当const关键字放在指针数据类型名的前面或后面时,即const;const;则指针指向的内存空间的内容不能改变。2.2.限制指针指向的改
19、变限制指针指向的改变当const关键字放在指针名和“”之间时,即 const;则指针的值不能修改,且必须在定义的同时进行设定,此时称该指针为指针常量,且它不能为左值。例如:float x,y;float*const p1=&x;/p1必须初始化p1=&y;/错误,p1不能为左值*p1=25;/合法,p1指向x的内存空间的内容可以修改3.限定指针的指向和内存空间内容的改变限定指针的指向和内存空间内容的改变当在指针数据类型的前面或后面及在指针名和“”之间都放有const关键字时,即const const;const const;则由指针指向的内存空间的内容不能修改,且指针的值(指向)不可修改。7.
20、2指针和数组数组名数组名数组名数组名表示的是该数组的首地址值,也是指向数组第一个元素的指针常量。表示的是该数组的首地址值,也是指向数组第一个元素的指针常量。表示的是该数组的首地址值,也是指向数组第一个元素的指针常量。表示的是该数组的首地址值,也是指向数组第一个元素的指针常量。7 7 7 7.2 2 2 2.1 .1 .1 .1 用指针访问数组元素用指针访问数组元素用指针访问数组元素用指针访问数组元素数组在内存中是顺序存储的,声明了某个指针指向数组中的一个元素,可数组在内存中是顺序存储的,声明了某个指针指向数组中的一个元素,可数组在内存中是顺序存储的,声明了某个指针指向数组中的一个元素,可数组在
21、内存中是顺序存储的,声明了某个指针指向数组中的一个元素,可以通过指针和整数的以通过指针和整数的以通过指针和整数的以通过指针和整数的加减运算(包括增加减运算(包括增加减运算(包括增加减运算(包括增1 1和减和减和减和减1 1运算)运算)运算)运算)来访问这个数组的每来访问这个数组的每来访问这个数组的每来访问这个数组的每个元素。由于数组名本身就是指向数组第一个元素的指针常量,可以通过个元素。由于数组名本身就是指向数组第一个元素的指针常量,可以通过个元素。由于数组名本身就是指向数组第一个元素的指针常量,可以通过个元素。由于数组名本身就是指向数组第一个元素的指针常量,可以通过它来访问其中的元素。它来访
22、问其中的元素。它来访问其中的元素。它来访问其中的元素。对于下面声明的数组对于下面声明的数组对于下面声明的数组对于下面声明的数组 比如:比如:比如:比如:int xint x5 5;数组名数组名数组名数组名x x是指向第一个元素是指向第一个元素是指向第一个元素是指向第一个元素x x0 0的指针,的指针,的指针,的指针,*x*x表示的就是元素表示的就是元素表示的就是元素表示的就是元素x x0 0的值;的值;的值;的值;*(x+2)*(x+2)则是访问则是访问则是访问则是访问x x2 2中的值的有效方法。中的值的有效方法。中的值的有效方法。中的值的有效方法。例例例例 1 1 1 1通过数组名访问数组
23、元素通过数组名访问数组元素通过数组名访问数组元素通过数组名访问数组元素#include#includevoid main()void main()int x int x5 5=1,2,3,4,5;=1,2,3,4,5;/声明数组声明数组声明数组声明数组x x5 5并初始化并初始化并初始化并初始化 for(int i=0;i5;i+)for(int i=0;i5;i+)/利用数组下标输出数组的全部元素利用数组下标输出数组的全部元素利用数组下标输出数组的全部元素利用数组下标输出数组的全部元素 coutx coutxi it;t;coutendl;coutendl;for(i=0;i5;i+)for
24、(i=0;i5;i+)/利用数组名输出全部元素利用数组名输出全部元素利用数组名输出全部元素利用数组名输出全部元素 cout*(x+i)cout*(x+i)t;t;coutendl;coutendl;1 2 3 4 51 2 3 4 51 2 3 4 51 2 3 4 5利用指向数组某个元素的指针访问数组中的每个元素利用指向数组某个元素的指针访问数组中的每个元素利用指向数组某个元素的指针访问数组中的每个元素利用指向数组某个元素的指针访问数组中的每个元素includeincludevoid main()void main()int x int x5 5,i;,i;int*px=x;int*px=x
25、;/声明指针,指向数组的首元素声明指针,指向数组的首元素声明指针,指向数组的首元素声明指针,指向数组的首元素 for(i=0;i5;i+)for(i=0;i5;i+)/利用数组下标的方法给数组元素赋值利用数组下标的方法给数组元素赋值利用数组下标的方法给数组元素赋值利用数组下标的方法给数组元素赋值 x xi i=i;=i;例例例例 2 2 2 2for(i=0;i5;i+)for(i=0;i5;i+)/利用指向数组的指针输出数组的元素值利用指向数组的指针输出数组的元素值利用指向数组的指针输出数组的元素值利用指向数组的指针输出数组的元素值 cout*px+cout*px+t;t;coutendl;
26、coutendl;px=x;px=x;for(i=0;i5;i+)for(i=0;i5;i+)/利用指向数组的指针给数组元素赋值利用指向数组的指针给数组元素赋值利用指向数组的指针给数组元素赋值利用指向数组的指针给数组元素赋值 *px+=2*i;*px+=2*i;px=x;px=x;for(i=0;i5;i+)for(i=0;i5;i+)cout*px+cout*px+t;t;coutendl;coutendl;0 1 2 3 40 1 2 3 40 2 4 6 80 2 4 6 8 7 7.2 2.2 .2 数组指针与指针数组数组指针与指针数组数组指针与指针数组数组指针与指针数组1.指针数组指
27、针数组定义:元素为指针的数组它的声明形式如下:它的声明形式如下:它的声明形式如下:它的声明形式如下:数据类型数据类型数据类型数据类型 *数组名常量表达式数组名常量表达式数组名常量表达式数组名常量表达式1 1常量表达式常量表达式常量表达式常量表达式2 2;指数组中各元素指针所指向指数组中各元素指针所指向指数组中各元素指针所指向指数组中各元素指针所指向的类型,同一指针数组中各的类型,同一指针数组中各的类型,同一指针数组中各的类型,同一指针数组中各指针元素指向的类型相同。指针元素指向的类型相同。指针元素指向的类型相同。指针元素指向的类型相同。是一个标识符,是这是一个标识符,是这是一个标识符,是这是一
28、个标识符,是这个数组的名字,也即个数组的名字,也即个数组的名字,也即个数组的名字,也即数组的首地址。数组的首地址。数组的首地址。数组的首地址。例如:例如:例如:例如:int*p1 int*p16 6;double*p2 double*p23 34 4;分别声明了含有分别声明了含有分别声明了含有分别声明了含有5 5个元素的一维个元素的一维个元素的一维个元素的一维intint指针数组指针数组指针数组指针数组p1p1和含有和含有和含有和含有1212个元素的二维个元素的二维个元素的二维个元素的二维doubledouble指针数组指针数组指针数组指针数组p2p2。指针数组的使用指针数组的使用指针数组的使
29、用指针数组的使用举例举例举例举例#include#includevoid main()void main()int x int x2 23 3=1,2,3,4,5,6;=1,2,3,4,5,6;int i,j;int i,j;int*px int*px2 2=x=x0 0,x,x1 1;/声明指针数组并初始化声明指针数组并初始化声明指针数组并初始化声明指针数组并初始化 for(i=0;i2;i+)for(i=0;i2;i+)for(j=0;j3;j+)for(j=0;j3;j+)cout*(px cout*(pxi i+j)+j)t;t;/利用指针数组输出其指向的元素的值利用指针数组输出其指向
30、的元素的值利用指针数组输出其指向的元素的值利用指针数组输出其指向的元素的值 coutendl;coutendl;例例例例 3 3 3 3首先声明了一个二维数组首先声明了一个二维数组首先声明了一个二维数组首先声明了一个二维数组x x2 23 3并赋初值。并赋初值。并赋初值。并赋初值。用于初始化的是用于初始化的是用于初始化的是用于初始化的是x x0 0和和和和x x1 1。它们分别表示。它们分别表示。它们分别表示。它们分别表示数组元素数组元素数组元素数组元素x x0 00 0及及及及x x1 10 0的地址。的地址。的地址。的地址。1 2 31 2 34 5 64 5 62.数组指针数组指针数组指
31、针:就是一个指向数组的指针声明形式如下:声明形式如下:声明形式如下:声明形式如下:数据类型数据类型数据类型数据类型 (*指针名)常量表达式指针名)常量表达式指针名)常量表达式指针名)常量表达式1 1常量表达式常量表达式常量表达式常量表达式2 2;比如:比如:比如:比如:int(*p)int(*p)5 5;声明了一个指向具有声明了一个指向具有声明了一个指向具有声明了一个指向具有5 5个元素的个元素的个元素的个元素的intint型数型数型数型数组的指针。组的指针。组的指针。组的指针。表达式中的圆括号表达式中的圆括号表达式中的圆括号表达式中的圆括号不可省略不可省略不可省略不可省略,因为,因为,因为,
32、因为 “”号的优先级比号的优先级比号的优先级比号的优先级比“*”“*”号高。号高。号高。号高。例例例例4 4、利用数组指针,利用数组指针,利用数组指针,利用数组指针,将将将将例例例例3 3 3 3改写为:改写为:改写为:改写为:#include#includevoid main()void main()int x int x2 23 3=1,2,3,4,5,6;=1,2,3,4,5,6;int i,j;int i,j;int(*px)int(*px)3 3=x;=x;for(i=0;i2;i+)for(i=0;i2;i+)for(j=0;j3;j+)for(j=0;j3;j+)coutpx c
33、outpxi ij jt;t;coutendl;coutendl;7.3指针与函数传值调用减少了主调函数与被调函数之间的数据依赖,被调函数中对形参值传值调用减少了主调函数与被调函数之间的数据依赖,被调函数中对形参值传值调用减少了主调函数与被调函数之间的数据依赖,被调函数中对形参值传值调用减少了主调函数与被调函数之间的数据依赖,被调函数中对形参值的任何改变都不会影响到实参。利用指针形参的改变对相应的实参有效。的任何改变都不会影响到实参。利用指针形参的改变对相应的实参有效。的任何改变都不会影响到实参。利用指针形参的改变对相应的实参有效。的任何改变都不会影响到实参。利用指针形参的改变对相应的实参有效
34、。7 7 7 7.3 3 3 3.1 .1 .1 .1 指针作为函数的参数指针作为函数的参数指针作为函数的参数指针作为函数的参数函数的某个参数是指针,对这个函数的调用就是函数的某个参数是指针,对这个函数的调用就是函数的某个参数是指针,对这个函数的调用就是函数的某个参数是指针,对这个函数的调用就是传址调用。传址调用。传址调用。传址调用。在进行传址调用时在进行传址调用时在进行传址调用时在进行传址调用时,函数的实参传递给形参的是一个地址,从而使得形参,函数的实参传递给形参的是一个地址,从而使得形参,函数的实参传递给形参的是一个地址,从而使得形参,函数的实参传递给形参的是一个地址,从而使得形参指针和实
35、参指针指向同一个地址。被调函数中对形参指针所指向的地址中指针和实参指针指向同一个地址。被调函数中对形参指针所指向的地址中指针和实参指针指向同一个地址。被调函数中对形参指针所指向的地址中指针和实参指针指向同一个地址。被调函数中对形参指针所指向的地址中内容的任何改变内容的任何改变内容的任何改变内容的任何改变都会影响到实参。都会影响到实参。都会影响到实参。都会影响到实参。例例例例 5 5 5 5 传址调用传址调用传址调用传址调用程序程序程序程序#include#includevoid swap(int*a,int*b);void swap(int*a,int*b);void main(void)vo
36、id main(void)int x(1),y(2);int x(1),y(2);cout In main function endl;cout In main function endl;cout Before swap:;cout Before swap:;cout x=x cout x=x t y=yendl;t y=yendl;swap(&x,&y);swap(&x,&y);cout In main function:endl;cout In main function:endl;cout After swap:;cout After swap:;cout x=x cout x=x t
37、 y=yendl;t y=yendl;void swap(int*a,int*b)void swap(int*a,int*b)int temp;int temp;cout In Swap function:endl;cout In Swap function:endl;cout Before swap:;cout Before swap:;cout*a=*a cout*a=*a t*b=*bendl;t*b=*bendl;temp=*a;temp=*a;*a=*b;*a=*b;采用传址调用时,被调函数中形参指向的采用传址调用时,被调函数中形参指向的采用传址调用时,被调函数中形参指向的采用传址调
38、用时,被调函数中形参指向的值的改变对实参有效。值的改变对实参有效。值的改变对实参有效。值的改变对实参有效。*b=temp;*b=temp;cout After swap:;cout After swap:;cout*a=*a cout*a=*a t*b=*bendl;t*b=*bendl;In main function:In main function:Before swap:x=1 y=2Before swap:x=1 y=2In swap function:In swap function:Before swap:*a=1*b=2Before swap:*a=1*b=2After swa
39、p:*a=2 *b=1After swap:*a=2 *b=1In main function:In main function:After swap:x=2 y=1After swap:x=2 y=1 注:注:在函数的传址调用中,传递的参数的值在函数的传址调用中,传递的参数的值在函数的传址调用中,传递的参数的值在函数的传址调用中,传递的参数的值并不改变,并不改变,并不改变,并不改变,也即指针本身的值并不改变,也即指针本身的值并不改变,也即指针本身的值并不改变,也即指针本身的值并不改变,改变的是它指向的值。改变的是它指向的值。改变的是它指向的值。改变的是它指向的值。7.3.2 返回指针的函数当
40、一个函数的返回值是指针时,通过返回的指针中存储的地址值,主调函数当一个函数的返回值是指针时,通过返回的指针中存储的地址值,主调函数当一个函数的返回值是指针时,通过返回的指针中存储的地址值,主调函数当一个函数的返回值是指针时,通过返回的指针中存储的地址值,主调函数就能访问相应内存中存放的数据,还能通过指针算术运算访问这个地址前后就能访问相应内存中存放的数据,还能通过指针算术运算访问这个地址前后就能访问相应内存中存放的数据,还能通过指针算术运算访问这个地址前后就能访问相应内存中存放的数据,还能通过指针算术运算访问这个地址前后内存中的值。内存中的值。内存中的值。内存中的值。指针作为函数返回值的情形,
41、较多地出现在主调函数需要访问返回指针作为函数返回值的情形,较多地出现在主调函数需要访问返回指针作为函数返回值的情形,较多地出现在主调函数需要访问返回指针作为函数返回值的情形,较多地出现在主调函数需要访问返回地址前后顺序存放的多个变量时,如数组、字符串。地址前后顺序存放的多个变量时,如数组、字符串。地址前后顺序存放的多个变量时,如数组、字符串。地址前后顺序存放的多个变量时,如数组、字符串。注注注注定义返回指针的函数的函数头一般形式如下:定义返回指针的函数的函数头一般形式如下:定义返回指针的函数的函数头一般形式如下:定义返回指针的函数的函数头一般形式如下:数据类型数据类型数据类型数据类型*函数名(
42、参数表)函数名(参数表)函数名(参数表)函数名(参数表)是函数返回的指针所指向数据的类型。是函数返回的指针所指向数据的类型。是函数返回的指针所指向数据的类型。是函数返回的指针所指向数据的类型。例例例例 6 6 6 6返回指针的函数的使用返回指针的函数的使用返回指针的函数的使用返回指针的函数的使用(求矩阵的转置)(求矩阵的转置)(求矩阵的转置)(求矩阵的转置)#include#includeint*transpose(const int(*p1)int*transpose(const int(*p1)3 3););void main()void main()int matrix int matr
43、ix2 23 3=1,2,3,4,5,6;=1,2,3,4,5,6;int i,j;int i,j;int*p;int*p;cout cout原矩阵原矩阵原矩阵原矩阵:endl;:endl;for(i=0;i2;i+)for(i=0;i2;i+)for(j=0;j3;j+)for(j=0;j3;j+)cout coutt ttmatrixtmatrixi ij j;coutendl;coutendl;p=transpose(matrix);p=transpose(matrix);cout cout转置矩阵转置矩阵转置矩阵转置矩阵:endl;:endl;for(i=0;i3;i+)for(i=0
44、;i3;i+)for(j=0;j2;j+)for(j=0;j2;j+)cout coutt tt*(p+i*2+j);t*(p+i*2+j);coutendl;coutendl;int*transpose(const int(*p1)int*transpose(const int(*p1)3 3)int i,j;int i,j;int(*p2)int(*p2)2 2;p2=new int p2=new int3 32 2;for(i=0;i3;i+)for(i=0;i3;i+)for(j=0;j2;j+)for(j=0;j2;j+)p2 p2i ij j=p1=p1j ji i;return
45、p2return p20 0;7.3.3 函数指针函数指针函数名函数名函数名函数名也是一个指向函数首地址的指针常量。可以声明一个指向函数的指也是一个指向函数首地址的指针常量。可以声明一个指向函数的指也是一个指向函数首地址的指针常量。可以声明一个指向函数的指也是一个指向函数首地址的指针常量。可以声明一个指向函数的指针,并使用该指针来调用函数。针,并使用该指针来调用函数。针,并使用该指针来调用函数。针,并使用该指针来调用函数。指向函数的指针指向函数的指针指向函数的指针指向函数的指针通常简称为通常简称为通常简称为通常简称为函数指针。函数指针。函数指针。函数指针。声明的一般形式如下:声明的一般形式如下
46、:声明的一般形式如下:声明的一般形式如下:数据类型数据类型数据类型数据类型 (*指针名)(参数表);指针名)(参数表);指针名)(参数表);指针名)(参数表);指函数返回值的类型,参数表中的内容应与指针所指函数返回值的类型,参数表中的内容应与指针所指函数返回值的类型,参数表中的内容应与指针所指函数返回值的类型,参数表中的内容应与指针所指向的函数的形参表相同。指向的函数的形参表相同。指向的函数的形参表相同。指向的函数的形参表相同。原矩阵:1 2 3 4 5 6 转置矩阵:1 4 2 5 3 6声明的函数指针可以声明的函数指针可以声明的函数指针可以声明的函数指针可以指向一个函数的首地址,指向一个函
47、数的首地址,指向一个函数的首地址,指向一个函数的首地址,该函数的返回值类型和形参该函数的返回值类型和形参该函数的返回值类型和形参该函数的返回值类型和形参表都必须与上述声明中指定的相同。表都必须与上述声明中指定的相同。表都必须与上述声明中指定的相同。表都必须与上述声明中指定的相同。比如:比如:比如:比如:int(*pfun)(int,int);int(*pfun)(int,int);声明了一个名为声明了一个名为声明了一个名为声明了一个名为pfunpfun的指针。该指针可以指向的指针。该指针可以指向的指针。该指针可以指向的指针。该指针可以指向返回值为返回值为返回值为返回值为intint型,有两个型
48、,有两个型,有两个型,有两个intint型参数的函数。型参数的函数。型参数的函数。型参数的函数。函数指针在使用前,必须先赋值。函数指针在使用前,必须先赋值。函数指针在使用前,必须先赋值。函数指针在使用前,必须先赋值。一般采用的赋值方法如下:一般采用的赋值方法如下:一般采用的赋值方法如下:一般采用的赋值方法如下:函数指针名函数指针名函数指针名函数指针名=函数名函数名函数名函数名函数名所代表的函数必须是函数指针可以指向的。函数名所代表的函数必须是函数指针可以指向的。函数名所代表的函数必须是函数指针可以指向的。函数名所代表的函数必须是函数指针可以指向的。函数指针的使用函数指针的使用函数指针的使用函数
49、指针的使用程序举例程序举例程序举例程序举例#include#includevoid add(double x,double y);void add(double x,double y);void sub(double x,double y);void sub(double x,double y);void mul(double x,double y);void mul(double x,double y);void div(double x,double y);void div(double x,double y);例例例例 7 7 7 7void main()void main()void(
50、*pfun)(double,double);void(*pfun)(double,double);/声明函数指针声明函数指针声明函数指针声明函数指针 double x,y;double x,y;char choice;char choice;coutPlease enter the two digit that will is calculated:;coutxy;cinxy;coutendl;coutendl;coutPlease the the type of calculation:(+or-or*or/);coutchoice;cinchoice;coutendl;coutendl;i