1、高级语言程序设计C+,张海威 南开大学信息技术科学学院,第6章 指针、引用与动态内存分配,初识指针,1,指针类型,2,动态内存分配,3,引用类型,4,2,Database & Information System Lab,程序实例,5,第6章 指针、引用与动态内存分配,初识指针,1,指针类型,2,动态内存分配,3,引用类型,4,3,Database & Information System Lab,程序实例,5,初识指针,什么是指针 指针是一种导出数据类型 基本类型的指针 数组类型的指针 指针类型的指针(多重指针) 函数的指针 类类型的指针 指针指向内存地址(指针表示地址) 可以提取所指内存地
2、址的值,这是指针的操作 地址由取地址运算表达式(&)、数组名、指针变量名描述,Database & Information System Lab,4,初识指针,指针的引入,Database & Information System Lab,5,初识指针,指针的引入 目前的知识无法解决的问题 变长数组问题 数组必须设置大小 字符数组表示字符串,需要设置足够大的数组 函数返回多个值的问题 希望函数的返回值为数组,Database & Information System Lab,6,初识指针,指针的引入 【例6.1】实现对一组整型数由小到大排序,Database & Information Sys
3、tem Lab,7,void sort(int a,int n) for(int i=0;ii;j-)if(ajaj-1)swap(aj,aj-1); ,初识指针,指针的引入 【例6.1】实现对一组整型数由小到大排序,Database & Information System Lab,8,void swap(int ,初识指针,指针的引入 【例6.1】使用指针,Database & Information System Lab,9,void sort(int *a,int n) for(int i=0;ii;j-)if(*(a+j)*(a+j-1)swap(a+j),(a+j-1); ,初识指
4、针,指针的引入 【例6.1】使用指针,Database & Information System Lab,10,void swap(int *x,int *y) int temp = *x;*x = *y;*y = temp; ,初识指针,指针的引入 【例6.1】两种写法的区别1,Database & Information System Lab,11,void sort(int a,int n)for(int i=0;ii;j-)if(ajaj-1)swap(aj,aj-1); ,void sort(int *a,int n)for(int i=0;ii;j-)if(*(a+j)*(a+j-
5、1)swap(a+j),(a+j-1); ,初识指针,指针的引入 【例6.1】两种写法的区别2,Database & Information System Lab,12,void swap(int ,void swap(int *x,int *y)int temp = *x;*x = *y;*y = temp; ,初识指针,指针的含义 指针类型说明* ; 数据类型 基本数据类型及其派生类型 类类型、结构类型 指针变量名 指针的名称为标识符 指针变量值内存中的地址 *代表指针所指内存地址存放的值,Database & Information System Lab,13,初识指针,指针的含义 指针
6、与数组的关系 指针与数组首地址建立联系 int a20; int *pa=a;/将数组a的首地址(a0的地址)赋值给指针pa 利用指针访问数组元素 for(int i=0;in;i+)/n为指针所表示数组的大小cout*(pa+i)endl; 指针可以处理不定长数组 最有代表性的就是表示字符串的字符数组,Database & Information System Lab,14,初识指针,代码分析x,y是指针类型,都表示地址 将地址x的值赋给temp 交换地址x和地址y上的值 将地址y上的值设置为temp,Database & Information System Lab,15,void swa
7、p(int *x,int *y)int temp = *x;*x = *y;*y = temp; ,第6章 指针、引用与动态内存分配,初识指针,1,指针类型,2,动态内存分配,3,引用类型,4,16,Database & Information System Lab,程序实例,5,指针类型,指针 类型,赋值,说明与初始化,指针与常量,指针与函数,主要运算,指针与数组,17,Database & Information System Lab,指针类型,指针变量说明 *,*; 数据类型:基本数据类型、用户定义类型 指针变量名:标识符 表示指针指向类型变量的首地址 不同数据类型在内存中占空间不同,指
8、向第一个字节所在的地址 指针指向的地址空间大小由数据类型决定 int *p; 指针变量名为p,指向某整型变量的首地址 未赋初值,属于悬挂状态,Database & Information System Lab,18,指针类型,指针变量说明 指针变量的值 该指针变量指向的地址 系统同样为指针变量分配空间 一般为4个字节 指针可以指向的“成分” 变量 常量 数组 函数 类对象,Database & Information System Lab,19,指针类型,指针变量初始化 初始化为内存地址 初始化时,“=”右边是能够表示地址的值 int a = 18; int *p = ,Database &
9、Information System Lab,20,a,p,p,指针类型,指针变量初始化 例如: int i=3; int *pi; /pi为int*型变量,其取值为一个int型变量的地址, /也称pi为指向int型数据的指针变量(简称指针)pi = /&作单目算符时为“取变量地址”,/此处将变量i的地址赋给指针变量pi,Database & Information System Lab,21,指针类型,指针变量的赋值 赋值运算符“=”类型一致 左边:指针变量(注意与初始化表达式的区别) int *p = 右边:描述地址的表达式 地址存放数据的类型与指针说明的类型一致 对指针绝不可任意赋一个内
10、存地址,只能取一个已经分配了内存的变量的地址赋给指针变量,或者赋值为0(NULL),不可赋地址常量,Database & Information System Lab,22,指针类型,指针变量赋值 例如: int i=3,*pi; pi = /*NULL 的指针变量,规则规定NULL 与整数0 通用,它是唯一可以赋给任一类型指针变量的值,表示当前该指针未指向任一变量。*/,Database & Information System Lab,23,指针类型,指针类型的运算 “*”取内容运算 运算表达式:* 可看作一个变量 作用于一个指针类型的变量 访问该指针所指向的内存数据,Database &
11、 Information System Lab,24,int a=18,*p; p = /输出0x456789bcd,是指针变量p的地址,a,p,指针类型,指针类型的运算 “,Database & Information System Lab,25,指针类型,第一行的“*pi”处于变量说明处,是说明pi为“int*”型变量,并同时将该指针变量初始化为i的地址。不可将此处的“*”理解为“取内容”运算,它与前面的int联合起来以说明pi为“int*”型变量。 第二行的“*pi”表示指针变量pi所指向的那一变量(即i)的内容(*理解为“取内容”运算,使用其值)。 第三行的“*pi”为左值(存储空间概
12、念),表示要改变指针变量pi所指向的那一变量(即i)空间中的内容(使用其存储空间),Database & Information System Lab,26,指针类型,数组指针的算术运算 当指针变量指向数组时,可以进行算术运算 +、-、+、- 若p为指针,已指向数组的某一元素,则p+i (或p-i,其中i为正整数)也为一指针,它指向当前p已指元素的后面(或前面)第i个元素 【例6.2】数组名做指针常量int a10; /*任一数组名字a都是一个指针常量, 代表数 组的首地址, 也即, a总等同于&a0*/,Database & Information System Lab,27,指针类型,无论
13、何时, 下述两种表示数组元素ai的方式总是相同的:a0 *a a1 *(a+1) .a9 *(a+9)另外,下述两种表示数组元素ai之地址的方式也总是相同的:&a0 a &a1 a+1 .&a9 a+9,Database & Information System Lab,28,指针类型,【例6.3】指针变量与数组的联系int a10; int* pa=a; /*pa为变量指针,此时pa与a均指向数组a的首元素 */下述三种表示数组元素ai的方式是等同的:a0 *a *paa1 *(a+1) *(pa+1).a9 *(a+9) *(pa+9),Database & Information Sys
14、tem Lab,29,指针类型,下述三种表示数组元素ai之地址的方式也是等同的:却都是不正确的句子! 为什么?)。,Database & Information System Lab,30,指针类型,数组指针的算术运算 若p,q都为同类型的指针,则p-q为p与q之间的数据项数(当p,q指向同一数组时,结果有意义),Database & Information System Lab,31,指针类型,指针的关系运算 若p,q都为同类型的指针,可进行关系运算 相等或不相等 根据指针指向的地址判断 与NULL进行比较 数组指针可以进行6种比较运算(通常用于p,q指向同一数组的情况,靠前者其指针值小),
15、Database & Information System Lab,32,指针类型,【例6.4】读程序,写出运行结果,Database & Information System Lab,33,#include using namespace std; int main()int i=3,j=6,*pi,*pj;pi = ,指针类型,指针类型举例 【例6.4】程序执行后的显示结果如下:i,j=3, 6*pi,*pj=3, 6*pi,*pj=123, 125i,j=123, 125,Database & Information System Lab,34,指针类型,指针类型举例 【例6.5】编程序
16、,首先输入5个整数放入数组a,而后按输入的相反顺序输出这5个数 #include void main()int i,a5,*p; /指针变量pcout*(a+i); cout=a; p-) / p=a为指针比较运算cout*p“ “; /*p指向各不同aicoutendl; /循环过程中p值总在变化(通过指针加减运算),Database & Information System Lab,35,指针类型,指针与常量 指针常量 指针本身是常量 固定指向一个对象的指针char ch=a,ch1=x;char * const ptr= /错误,指向的地址固定不变ptr本身在初始化时所指向的地址是不可改
17、变的,但它指向的目标ch的值是可以改变的,Database & Information System Lab,36,指针类型,指针与常量 常量指针 指向“常量”的指针 指针本身可以改指向别的对象,但不能通过该指针修改对象,该对象可以通过其他方式修改,常用于函数的参数,以免误改了实参。char ch=a,ch1=x;const char * ptr1= /正确,Database & Information System Lab,37,指针类型,指向数组 元素的 指针,指向数组 的指针,指针 数组,多重 指针,字符串 指针,指针与数组,指针类型,38,Database & Information
18、System Lab,指针类型,指针与数组概述 指针访问一维数组元素(设int a100;) 将数组的首地址赋值给指针变量 用数组名赋值 int *p=a; 用数组第一个元素地址赋值 int *p= 指针表示字符串 等价于指向字符数组元素的指针,Database & Information System Lab,39,指针类型,指针与数组 指向数组元素的指针 数组元素可以看作相应数据类型的变量 指向数组元素的指针类似于一般的指针int n10;int *pn = /等价于int *pn=&n0,Database & Information System Lab,40,指针类型,指针与数组 指向
19、数组元素的指针 建立指向数组元素的指针 首地址赋给指针变量 用指针数据元素的访问 指针的加、减、增量、减量运算 常量指针方式 数组名即常量指针,常量指针进行运算 指针变量方式 将数组首地址赋予指针变量,指针变量进行运算,Database & Information System Lab,41,指针类型,指针与数组 【例6.6】指针访问数组元素 #include using namespace std; int main()int i,fibon10=0,1,1,2,3,5,8,13,21,34,*pfib1,*pfib2;pfib1=pfib2=fibon; /也可以用pfib1=pfib2=
20、 ,Database & Information System Lab,42,指针类型,指针与数组 【例6.6】分析下标访问方式 常量指针访问方式 指针变量访问方式 指针移动的字节数与数组数据类型有关 例如,整型指针p指向整型数组a中的元素,指针p每次移动4个字节,Database & Information System Lab,43,指针类型,指针与数组 指向a数组元素的指针p,Database & Information System Lab,44,指针类型,指针与数组 指向二维数组元素的指针 将数组首地址赋予指针 按照一维数组的存储方式移动指针 int A34= int *pa=A0;
21、 for(;paA0+12;pa+)cout*paendl;,Database & Information System Lab,45,指针类型,指针与数组 指向数组的指针(数组指针) 把数组作为整体,指向这样一个整体的指针被称为指向数组的指针。 指向一维数组的指针说明格式:(* ) int (*pa)4; pa指向一维整型数组,该数组包含4个整型元素 *pa为该一维整型数组的首地址 int A34; int (*pa)4=A; pa指向二维数组的第一个元素A0,Database & Information System Lab,46,指针数组,指针与数组 指向数组的指针,Database &
22、 Information System Lab,47,指针类型,指针与数组 指向数组的指针,Database & Information System Lab,48,指针类型,指针与数组 指向数组的指针 赋值时,注意一致性 例如:指向一维数组 int Ax4;/x为任意正整数 int (*pa)4; pa = A;/保持维度一致性 指向多维数组 int Ax34;/x为任意正整数 int (*pa)34; pa = A;/保持维度一致性,Database & Information System Lab,49,指针类型,指针与数组 指向数组的指针int (*pa)4;/可理解为*pa为具有4个
23、int型分量的一维数组名int A34=11,12,13,14, 21,22,23,24,31,32,33,34 ;pa=A; /pa指向A数组的第一行cout*(*(pa+2)+3)endl;/pa+2值为地址cout(*pa)0“ “(*pa)1“ “(*pa)2“ “(*pa)3endl; /输出第一行4元素 pa+; /一步向后“迈过”pa所指向的那一个一维数组/的整体大小,使pa指向A数组的第二行 cout(*pa)0“ “(*pa)1“ “(*pa)2“ “(*pa)3endl; /输出第二行4元素,Database & Information System Lab,50,指针类型
24、,输出结果为:34 11,12,13,14 21,22,23,24,Database & Information System Lab,51,指针类型,指针与数组 指向数组的指针 用指针访问多维数组的一种方式 如果访问n维数组,那么指针的维度为n-1 指针指向的地址为构成该n维数组第一个n-1维数组的首地址 p+i=Ai,Ai为n-1维的数组 *(p+i)为n-1维数组Ai的首地址 *(p+i)+j为n-2维数组Aij的首地址 *(*(p+i)+j)+k为n-3维数组Aijk的首地址 ,Database & Information System Lab,52,指针类型,指针与数组 指针数组 分
25、量为指针的数组,数组中每个元素都是指针变量 其说明格式为(一维数组时):* 说明多维数组时, 将指定多个方括号括起的* ,Database & Information System Lab,53,指针类型,指针与数组 指针数组int w,x,y,z,A210;int * p14= /*A0表示A数组的第一行,为含有10个元素的一维数组(的数组名),表示一个常量地址,将数组A0的首地址赋予指针变量P20*/,Database & Information System Lab,54,指针类型,【练习6.1】设三个整型数组year、month和day,分别存储年、月、日。以指针为参数实现排序函数,对
26、日期进行由小到大排序,Database & Information System Lab,55,指针类型,指针与数组 多重指针 指向指针的指针 int x, *p, *q; /q为指向指针的指针 x=123; p=/*q为一重指针,Database & Information System Lab,56,指针类型,指针与数组 多重指针 二重指针 指向指针,赋值时必须将一重指针(或与一重指针等价)的地址赋给二重指针 二重指针指向一重指针的地址 二重指针的值为一重指针所在地址的值,Database & Information System Lab,57,指针类型,指针与数组 多重指针,Databa
27、se & Information System Lab,58,指针类型,指针与数组 【例6.7】读程序,写出运行结果 #include using namespace std; int main()char *p;char *name=“BASIC“,“PASCAL“,“C+“;p = name + 2;coutpendl;/name数组第3个元素的地址cout*pendl;/name数组的第3个元素cout*pendl;/ name数组的第3个元素的值return 0; ,Database & Information System Lab,59,指针类型,运行结果:0012FF78 C+ C
28、,Database & Information System Lab,60,指针类型,指针与数组 【例6.7】解析 字符串常量能够表示地址,是其首字符的地址 指针数组name由3个元素组成,分别是:字符B的地址,字符P的地址和字符C的地址 其它类型常量不能初始化指针数组 访问指针数组(一维)中的元素,用二重指针,Database & Information System Lab,61,指针类型,指针与数组 二重指针与数组 与字符串指针数组关联 直接赋值,见【例6.7】 与二维数组关联 通过动态内存分配的方式(见后面章节) 不允许直接用二维数组首地址赋值给指针变量 必须为二维数组的每一维动态分配
29、内存 n重指针可以与n维数组关联 关联方式与二重指针类似,Database & Information System Lab,62,指针类型,指针与字符串 字符串是字符类型的数组 与数组相关的指针变量都可和字符串关联 【例如】 char str=“china”; char*str=“china”; 指针变量str指向字符串的首地址,即字符c的地址,Database & Information System Lab,63,指针类型,指针与字符串 字符串指针 指向字符数组元素的指针 说明、初始化方式与指向数组元素指针相同 char s10=“china”; char *str = s;/char
30、*str= ,Database & Information System Lab,64,指针类型,指针与字符串 字符串的整体输入输出 按字符输出 while(*str!=0)coutstr; coutstr; 能够处理变长字符串 不必说明字符串长度(字符数组则必须说明大小),Database & Information System Lab,65,指针类型,指针与字符串 【例6.8】读程序,写出运行结果 #include using namespace std; int main()char as 10=“world“;char *pc2“world“;char *pc3=as;coutase
31、ndl;coutpc2endl;coutpc3endl;return 0; ,Database & Information System Lab,66,运行结果为: world world world,指针类型,指针与字符串 字符串指针数组 以字符串指针组成的数组 【例如】 char *menu“File”,“Edit”,“Search”,“Help”;是一个字符串指针数组,它的每个元素指向一个字符串常量。menu0,menu1,menu2,menu3将分别表示”File”,”Edit”,”Search”和“He1p”,Database & Information System Lab,67,
32、指针类型,指针与字符串 字符串的标准函数 求字符串长度函数strlen(长度不包括串尾符)unsinged strlen( const char *str); 字符串拷贝函数strcpychar *strcpy( char *s, const char *t); 字符串连接函数strcatchar *strcat( char *s, const char *t); 字符串比较函数strcmpint strcmp(const char *s1, const char *s2); 使用这些函数时要在程序中包含头文件string.h,Database & Information System Lab
33、,68,指针类型,指针与字符串 字符串长度函数 unsinged strlen( const char *str); 返回值为整型,是字符串的长度 这里求出的串长度不包含串结束符在内。而sizeof运算符包括结束符,还包括没有使用的单元。,Database & Information System Lab,69,指针类型,指针与字符串 字符串拷贝函数 char *strcpy(char *s,const char *t); 返回值是指向复制后字符串中首字符的指针 另一个拷贝函数可指定复制多少字符: char *strncpy(char *s,const char *t,size_t n); 字
34、符串常用size_t代替整型,其说明方法如下: typedef int size_t; 用易读性更好的数组长度size_t来代替通用的int,Database & Information System Lab,70,指针类型,指针与字符串 字符串拷贝函数的一种实现方法void scopy2(char *s, char *t)while(*t != 0)*s = *t;s = s + 1; t = t + 1; *s = 0; ,Database & Information System Lab,71,指针类型,指针与字符串 字符串连接函数 char *strcat(char *s, const
35、 char *t); 将串ct复制到串s的后面,形成一个长串。例如: char str130=“张成”; char str220=“是电子系的学生”; strcat(str1,str2); 结果是str1中放的是“张成是电子系的学生”。,Database & Information System Lab,72,指针类型,指针与字符串 字符串比较函数 int strcmp(const char *s1, const char *s2); 两字符串比较是按字典排序方法进行。两个字符串从第一个字符比较起,如果相同,则比较第二个字符,依此类推,直到不同。哪个字符串对应的字符的ASCII码值大,串就大。
36、如果两串直到结束符都相同,则一样大。 若两个字符串相等,则返回0;串s1大,则返回正整数;串s2大,则返回负整数。,Database & Information System Lab,73,指针类型,指针与字符串 【例6.9】输出字符串地址(首地址) #include using namespace std; int main()char *string1=“欢迎学习C+程序设计课程!“;cout“串值是:“string1“n串地址是:“(void*)string1endl;return 0; 通常用输出数组名得到的是数组地址,但字符型数组(字符串)不同,输出的是数组内容。本例将字符指针强制转
37、换为空指针输出字符串地址。,Database & Information System Lab,74,指针类型,【练习6.2】设计一个字符串指针数组name,将该数组的元素按照第一个字母的ASCII码由小到大排序,如果第一个字母相同,则按第二个字母排序,以此类推。,Database & Information System Lab,75,指针做函数的参数,函数返回值是指针,指向函数的指针,指针与函数,76,Database & Information System Lab,指针类型,指针类型,指针作为函数参数 通过指针(如数组名,或其它指针变量)作为函数参数,可起到“双向传递”数据的功能 形参
38、 指针变量 实参 指针变量 普通变量,但在函数中操作的是变量的地址 对形参指针所指变量值的使用与改变,就是对实参指针所指变量值的直接使用与改变,Database & Information System Lab,77,指针类型,指针作为函数参数 调用函数时,注意实参和形参的类型一致性,Database & Information System Lab,78,形参为指针类型时,实参可以是 指针类型变量 地址表达式 指针指向的数据类型的 普通变量 当实参为普通变量时,在 函数体中将对实参的地址 进行操作,指针类型,指针作为函数参数 【例6.10】指针作参数时,函数调用的类型一致性示例 #inclu
39、de using namespace std; void swap(int *x,int *y) int temp = *x;*x=*y;*y=temp; ,Database & Information System Lab,79,指针类型,int main() int a=1,b=2;int *p= ,Database & Information System Lab,80,指针类型,指针作为函数参数 【例6.11】读程序,写出运行结果 #include void myFunc(int *p, int num); void main()int a6=1,2,3,4,5,6;int* pa=a
40、;cout“before calling muFunc *(pa+i)=“endl;for(int i=0;i6;i+)cout*(pa+i)“ “;coutendl;myFunc(pa,6); /指针pa作为实参去调用自定义函数muFunccoutendl“after calling muFunc *(pa+i)=“endl;,Database & Information System Lab,81,指针类型,for(i=0;i6;i+)cout*(pa+i)“ “;/输出被myFunc改变后以pa为首地址的/各元素值(每一数都加了100)coutendl; void myFunc(int
41、*p, int num)int sum=0;for(int i=0;inum;i+)sum+=*(p+i); coutendl“in myFunc, sum of *(p+i)=“sumendl; for(i=0;inum;i+)*(p+i)+=100; ,Database & Information System Lab,82,指针类型,【例6.11】运行结果 before calling muFunc *(pa+i)= 1 2 3 4 5 6in myFunc, sum of *(pa+i)=21after calling muFunc *(p+i)= 101 102 103 104 10
42、5 106,Database & Information System Lab,83,指针类型,指针作为函数的参数 【例6.12】读程序,写出运行结果 #include void swap1(int* p1, int* p2); /指针参数 void swap12(int* p1, int* p2); /指针参数 void swap2(int,Database & Information System Lab,84,指针类型,b1=11, b2=22;cout b1,b2 = “ b1,b2 = “ c1,c2 = “ c1,c2 = “c1“ “c2“nn“;,Database & Info
43、rmation System Lab,85,指针类型,int d1=55, d2=66;cout d1,d2 = “ d1,d2 = “d1“ “d2“nn“; void swap1(int* p1, int* p2) /交换指针所指变量的值int temp;temp = *p1; *p1 = *p2; *p2 = temp; ,Database & Information System Lab,86,指针类型,void swap12(int*p1,int*p2)/交换形参指针“局部空间”的值int* temp;temp = p1;p1 = p2;p2 = temp; void swap2(i
44、nt ,Database & Information System Lab,87,指针类型,【例6.12】程序执行后的显示结果如下:before swap1 = b1,b2 = 11 22 after swap1 = b1,b2 = 22 11before swap12 = b1,b2 = 11 22 after swap12 = b1,b2 = 11 22before swap2 = c1,c2 = 33 44 after swap2 = c1,c2 = 44 33before swap3 = d1,d2 = 55 66 after swap3 = d1,d2 = 55 66,Databas
45、e & Information System Lab,88,指针类型,函数返回指针(返回值为指针类型) 返回值为指针的函数称为指针型函数,其返回类型的说明应指明指针的对象类型后加“*”符号 说明格式:* ( );【例如】int * f();/f为无参函数,其返回值类型/为int*,即指针类型。,Database & Information System Lab,89,指针类型,函数返回指针 【例6.13】函数返回指针示例 #include using namespace std; char *menu=“Error!“,“File“,“Edit“,“Search“,“Help“; char *
46、menuitem(int m)return(m4)?menu0:menum; ; int main()int x;char *c;cinx;c = menuitem(x);coutcendl;return 0; ,Database & Information System Lab,90,指针类型,函数返回指针 指针型函数的设计,应注意返回的指针在该函数被调用的域内是有确切的对象变量的。切不可返回指向函数体内说明的局部变量或参数变量的指针,或无指向的指针。 【例6.14】设计程序,实现如下功能:提示用户输入任意一个字符串,而后找到输入串中第一个a字符出现的位置(若有的话),并输出从a字符开始的子
47、串; 若输入串中不出现a字符的话, 输出 “No match found”。,Database & Information System Lab,91,指针类型,#include #include /use gets char * match(char c, char * str); /返回str中第一个c字符出现的位置(地址值,即指向字符的指针) void main()char s80, *p;cout“pendl; else /s中不含有a字符cout“No match found“endl; ,Database & Information System Lab,92,指针类型,char
48、* match(char c, char * s) /找str中第一个c字符出现的位置并返回int i=0;while( si!=c /没找到时返NULL 运行结果: Input a string: I am a student. Sub_str from first a =am a student.,Database & Information System Lab,93,指针类型,函数指针 指向函数的指针 函数具有地址(称为入口地址) 函数的地址也可作指针的值,这就是函数指针。函数指针的说明格式与函数的原型相似,主要区别是:原来的函数名,用*函数指针名所代替 说明格式: (*pf)( );
49、 【例如】int (*pf)(); pf为指向函数的指针(即*pf为函数名),该函数无参,且返回值类型为int。,Database & Information System Lab,94,指针类型,函数指针 【例6.15】通过使用指向函数的指针变量来调用自定义函数max及min #include int max(int x, int y) /自定义的max函数return (xy?x:y); int min(int x, int y) /自定义的min函数return (xy?x:y); void main()int (*p)(int,int); /*p为指向函数的指针(即*p为函数名),该函数有两个int型参数, 且返回值类型也为int*/int a,b,c;char tmp;,