在C语言中,函数名表示该函数的存储首地址,即函数的执行入口地址。
例如,在程序中定义了以下函数:
int func();
则函数名func就是该函数的入口地址。当调用函数时,程序流程转移的位置就是函数名给定的入口地址。因此可以把函数名赋予一个指针变量,该指针变量的内容就是该函数的程序存储区的首地址。这种指针变量称为指向函数的指针,简称函数指针。它的定义形式如下:
数据类型(*指针变量名)(形参表列);
数据类型是指针指向的函数所具有的数据类型,即函数返回值的类型。
例如:
int(*p)();
这里定义了一个指针变量p,可以用来存储一个函数的存储地址,该函数是一个int型函数,即函数返回值是int类型。要注意,在函数指针定义中,函数指针名的圆括号绝对不能默认。例如,若默认该圆括号就成为下列形式:
int*p();
这里声明了一个函数p,返回值为一个int型的指针。因此要注意定义格式中的括号不能省略。
程序中可以给函数指针变量赋予不同函数的存储地址。当函数指针被赋予某个函数的存储地址后,它就指向该函数。
例如:
p=func;
指针变量指向了函数func,即在指针变量p中存放该函数的入口地址。
【例7.24】求x和y中的较大者。
(1)用一般的函数调用方法实现,程序内容如下:
1 #include<stdio.h>
2 int max(int a,int b)
3 {
4 if(a>b)
5 return a;
6 else
7 return b;
8 }
9 int main()
10 {
11 int x,y,z;
12 scanf("%d,%d",&x,&y);
13 z=max(x,y);(www.xing528.com)
14 printf("x=%d,y=%d,max=%d\n",x,y,z);
15 return 0;
16 }
main()函数中的“z=max(x,y);”语句调用了max()函数。每个函数都占用一段内存单元,并且有一个起始地址,所以,可以用一个指针变量指向一个函数,并通过指针变量来访问它所指向的函数。
(2)用指针形式实现对函数调用的方法。可以将main()函数作如下修改:
1 int main()
2 {
3 int max(int a,int b);
4 int(*p)(int,int);
5 int x,y,z;
6 p=max;
7 printf("input two numbers:\n");
8 scanf("%d%d",&x,&y);
9 z=(*p)(x,y);
10 printf("x=%d,y=%d,max=%d\n",x,y,z);
11 return 0;
12 }
其中,“int(*p)(int,int);”语句用来定义一个指向函数的指针变量,*p两侧的括号不能省略,表示p先与“*”结合,是指针变量,然后再与后面的“()”结合,表示此指针变量指向函数,函数的返回值是整型的。如果写成“int*p(int,int);”,则由于“()”的优先级高于“*”,此语句就成声明一个p函数了,而这个函数的返回值是指向整型变量的指针。
赋值语句“p=max;”的作用是将函数max()的入口地址赋给指针变量p。
从上述程序可以看出,用函数指针变量形式调用函数的步骤如下:
(1)先定义函数指针变量,如后一程序main()函数中的“int(*p)(int,int);”语句,它定义p为函数指针变量,它不是固定指向哪一个函数的,而只是表示定义了这样一个类型的变量,并专门用来存放函数的入口地址。在程序中把哪一个函数的地址赋给它,它就指向哪一个函数。在一个程序中,一个指针变量可以先后指向相同类型的不同函数。
(2)把被调函数的入口地址(函数名)赋予该函数指针变量,如程序中的“p=max;”语句。在给函数指针变量赋值的时候只需给出函数名而不必给出参数,这里是将函数入口地址赋给p,而不牵涉实参和形参相结合的问题,因而不能写成“p=max(x,y);”。
(3)用函数指针变量形式调用函数,如程序中的“z=(*p)(x,y);”只需用“(*p)”代替函数名即可,再根据需要写上实际参数。这里要注意函数的返回值的类型。
(4)调用函数的一般形式为:
(*指针变量名)(实参表);
使用函数指针变量还应注意以下三点:
(1)函数的调用可以通过函数名调用,也可以通过函数指针调用。
(2)函数指针变量不能进行算术运算,这是与数组指针变量不同的。数组指针变量加减一个整数可使指针移动指向后面或前面的数组元素,而函数指针的移动,如p++、p+n、p--等运算是无意义的。
(3)函数调用中“(*指针变量名)”两边的括号不可少,其中的“*”不应该理解为求值运算,在此处它只是一种表示符号。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。