首页 > 编程笔记

C语言函数指针的使用

函数指针是指向函数的指针变量。因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型变量、实型变量一样,这里是指向函数。我们知道,C语言程序在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。

C语言函数指针的定义

用指针变量可以指向一个函数。函数在程序编译时被分配了一个入口地址,这个函数的入口地址就称为函数的指针。

C语言函数指针的定义如下:

数据类型(*函数指针名)(形参类型表);

注意:“数据类型”说明函数的返回类型。“(*函数指针名)”中的括号不能省,若省略则整体成为一个函数说明。“形参类型表”表示指针变量指向的函数所带的参数列表。例如:

int  ( *p ) ( int, float);

上面的代码定义指针变量 p 可以指向一个整型函数,这个函数有两个形参,即 int 和 float。

函数指针变量常见的用途之一是把指针作为参数传递到其他函数。指向函数的指针也可以作为参数,以实现函数地址的传递,这样就能够在被调用的函数中使用实参函数。

C语言函数指针的赋值

C语言函数指针的赋值形式:

指针变量名=函数名;

例如:p=fun,设 fun 函数原型为 int fun(int s,float t)。

用指针变量引用函数:用(*指针变量名)代替函数名。例如:x=(*p)(a,b)与 x=fun(a,b)等价。

函数指针一般用于在函数中灵活调用不同函数。

通过C语言函数指针调用函数

可以用一个指针变量指向函数,然后通过该指针变量调用此函数。下面用简单的数值比较为例。代码如下:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int max(int,int);
    int (*p)(int,int);         //定义指向函数的指针
    int a,b,c;
    p = max;              //指向max()函数
    printf("输入a和b的值\n");
    scanf("%d%d",&a,&b);
    c = (*p)(a,b);           //max()函数返回值
    printf("%d 和 %d 中较大的值是 %d\n",a,b,c);
    return 0;
}
int max(int x,int y)
{
    int z;
    if(x>y)  z = x;
    else    z = y;
    return z;
}
运行结果:

输入a和b的值
3 6
3 和 6 中较大的值是 6

示例分析:

1) 第 6 行:int(*p)(int,int);用来定义 p 是一个指向函数的整型指针变量,该函数有两个整型参数,函数值为整型。

注意,*p 两侧的括号不可省略,表示 p 先与 * 结合,是指针变量,然后再与后面的 () 结合,表示此指针变量指向函数,这个函数值(即函数的返回值)是整型的。如果写成 int*p(int,int),由于 () 的优先级高于 *,它就成了声明一个函数 P (这个函数的返回值是指向整型变量的指针)。

2) 第 8 行:p=max;的作用是将 max() 函数的入口地址赋给指针变量 p。

与数组名代表数组首元素地址类似,函数名代表该函数的入口地址。这时 p 就是指向 max() 函数的指针变量,此时 p 和 max() 函数都指向函数开头,调用 *p 就是调用 max() 函数。

但是 p 作为指向函数的指针变量,它只能指向函数入口处而不可能指向函数中间的某一处指令处,因此不能用 *(p+1) 来表示指向下一条指令。

3) 第 11 行:c=(*p)(a,b);说明利用 p 调用 max() 函数,相当于调用了 c=max(a,b)。

优秀文章