欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

指向函数的指针变量

程序员文章站 2024-02-29 17:22:46
...

1. 说明:

函数在编译时会被分配给一个入口地址, 而指针变量用于存放地址(指针), 所以可以使用指针来指向函数并调用该函数, 这个指针就是函数指针 .

2. 定义 :

类型名 (*指针变量名)  (函数参数列表)

3. 注意 :

1) 定义指向函数的指向变量, 并不意味其能指向任何函数, 而是只能指向定义时指向的类型函数 .

2) 若需要用指针调用函数, 必须先使用指针变量指向该函数 .

3) 给函数指针变量赋值时, 只需给出函数名而不用给参数 (eg: Funptr &sum) . 

4) 若 ptr 指针指向某个函数, 则除了使用函数名调用函数外, 还可使用 (*ptr) 代替函数名, 后面和使用函数名调用函数一样的, 需要给出调用的参数, 若有返回值同样和调用函数一样接收返回值即可 .

5) 一般的指针是可以进行相关算数运算的(eg: "ptr++"), 但函数指针是不可以进行任何算数运算的 . 

4. 优点 :

使用函数名调用函数, 只能调用所指向的一个函数, 而通过指针变量调用函数比较灵活, 其可根据不同情况先后调用不用函数 .

5. 案例及详细分析 :

#include <stdio.h>

// 声明 sum 函数 (也叫函数签名) 
int sum(int,int);

int main (void)
{
    int a, b;
    
    /*类似 main 函数上的 sum 函数的声明一样, 声明 FunPtr函数指针变量 
    (也可以理解为FunPtr的函数签名,其指向的函数具有两个整数输入和一个整数输出)*/
    int (* FunPtr) (int, int);    
    
    /*类似 main 函数下的 sum 函数的正式定义一样, 正式定义 FunPtr 函数
    指针指向的地址为函数 sum 的入口地址 . */
    FunPtr = & sum;
    
    // 用于对比的测试数据 a 
    a = sum(3,7);         
        
    // 调用函数指针 FunPtr (引用指针函数和引用指针变量都是一样的, 必须使用: "*")
    b = (* FunPtr) (3, 7);        

    printf("sum(3,7) = %d.\n(*FunPtr)(3,7) = %d\n", a, b);
    return 0;
}
// 正式定义 sum 函数 : 
int sum(int x, int y)
{
    return (x+y);
}

 指向函数的指针变量