C语言中函数指针

2024 年 6 月 15 日 星期六(已编辑)
/ ,
38
2
摘要
本文介绍了C语言中函数指针的使用方法及其在回调函数中的应用,并讲解了如何使用typedef简化函数指针的定义。函数指针可以通过特定语法定义,并指向具体的函数,以调用该函数。函数指针常用于回调函数,作为参数传递给其他函数,实现灵活的函数调用。为简化复杂函数指针的定义,可以使用typedef关键字为函数指针声明别名,提高代码的可读性和简洁性。本文通过实例代码展示了这些概念的实际应用。
这篇文章上次修改于 2024 年 6 月 19 日 星期三,可能部分内容已经不适用,如有疑问可询问作者。

C语言中函数指针

一.如何使用

如下所示,这是一个简单的案例。

#include<stdio.h>

void print(){
    printf("我被执行了!!!\n");
}

int main(){
    
    // 定义一个函数指针
    void (*p1)() = print; 
    void (*p2)() = &print;
    p1();
    (*p2)();
    
    return 0;
}

以上的代码首先是先定义一个函数指针通过 void (*[指针的名字])() 定义了一个函数指针,再将需要指向的函数的地址给到这个指针,最后通过使用 [指针的名字]() or (*[指针的名字])(),两者都是可以的。

二.回调函数

函数指针经常被使用在回调函数中,因为特有的性质,函数指针可以被视作参数传递给函数,如下是一个简单的例子。

#include<stdio.h>

void print(){
    printf("我被执行了!!!\n");
}

void test(void (*p)()){
    p();
    printf("test the function\n");
}

int main(){
    
    // 定义一个函数指针
    void (*p1)() = print; 

    test(p1);
    
    return 0;
}

当然这是一个比较简单的例子,我们可以尝试让传递的指针更加复杂。

#include<stdio.h>



void test2(int (*s)(int ,int ),int a,int b){
    printf("s = %d\n",s(a,b));
}


int sum(int a, int b){
    return a+b;
}

int main(){
    
    // 定义一个函数指针
    int (*s)(int ,int ) = sum;
    
    test2(s,1,2);
    
    return 0;
}

我们可以发现,通过这种方式定义指针特别麻烦,无论是在定义指针,还是在定义函数的形式参数时,遇到比较复杂的函数指针,代码就会显得不够优雅,为了解决这个问题就需要使用 typedef 关键字来定义别名

三.typedef 在函数指针中的使用

首先声明一个别名,如下。

typedef int (*PP)(int,int);

定义好后,我们就可以开始使用了


#include<stdio.h>
typedef int (*PP)(int,int);


void test2(int (*s)(int ,int ),int a,int b){
    printf("num = %d\n",s(a,b));
}


int sum(int a, int b){
    return a+b;
}

int main(){
    
    // 定义一个函数指针
    int (*s)(int ,int ) = sum;
    PP p= sum;
    test2(p,1,1);
    
    test2(s,1,2);
    
    return 0;
}

可以看到一样的效果,不仅代码的可读性增加了,也更加简洁了。

使用社交账号登录

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...