• 【C/C++】函数指针与指针函数


    作者:柒号华仔
    个人主页:欢迎访问我的主页
    个人信条:星光不问赶路人,岁月不负有心人。
    个人方向:主要方向为5G,同时兼顾其他网络协议,编解码协议,C/C++,linux,云原生等,感兴趣的小伙伴可以关注我,一起交流。


    1. 函数指针

    1.1 概念定义

    函数指针是指向函数的指针变量。 因此函数指针本质上是一个指针变量,只不过该指针变量指向函数。指针变量也可以指向整型变量、字符型、数组,也可以指向函数。
    C语言中,每一个函数都有一个入口地址,函数指针就指向函数的入口地址,可以通过函数指针来调用函数。

    例如 :int (*fun)(int x,int y);
    另外定义一个常用函数为 void func( ),那么fun=func; fun这时就是 func( )这个函数的入口地址了。


    1.2 声明方法

    函数指针的声明方法为:
    返回值类型 ( * 指针变量名) ([形参列表])

    “返回值类型”说明函数的返回类型,“(指针变量名 )”中的括号不能省,括号改变了运算符的优先级,后面的“形参列表”表示指针变量指向的函数所带的参数列表。例如:

    int func(int x);  	//声明一个函数
    int (*fun)(int x,int y);  //声明一个函数指针 
    fun = func;  			// 将func函数的首地址赋给指针fun 
    
    • 1
    • 2
    • 3

    或者将函数地址赋给函数指针:

    fun = &func;
    
    • 1

    赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针fun就指向函数func(x)的首地址。


    1.3 调用方法

    下面的实例说明了函数指针调用函数的方法:

    #include 
      
    //返回两个数中较大的一个
    int max(int a, int b){
        return a>b ? a : b;
    }
    
    int main(){
        int x, y, maxval1,maxval2;
        int (*pmax)(int, int); //定义函数指针
        pmax = max;
    
        printf("Input two numbers:");
        scanf("%d %d", &x, &y);
    
        maxval1 = (*pmax)(x,y);
        printf("Max value 1: %d\n", maxval1);
    
        maxval2 = pmax(x,y);
        printf("Max value 2: %d\n", maxval2);
    
        return 0;
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    运行结果:

    Input two numbers:5 8
    Max value 1: 8
    Max value 2: 8
    
    • 1
    • 2
    • 3

    maxval1 = (pmax)(x,y)对函数进行了调用。pmax 是一个函数指针,在前面加 * 就表示对它指向的函数进行调用。注意( )的优先级高于,第一个括号不能省略。
    maxval2 = pmax(x,y),pmax就是函数max的入口地址,pmax(x,y)等同于max(x,y)。
    注意这里pmax是一个指针变量,它可以指向任何函数,也就是说这里指向了函数max(),但它也可以再指向其他函数。如果我们直接调用函数名称,比如max,那么它是不可变的。


    1.4 函数指针作为函数参数

    #include 
      
    //返回两个数中较大的一个
    int max(int a, int b){
        return a>b ? a : b;
    }
    
    int fun(int (*pfun)(int, int), int a, int b){
        pfun(a,b);
    }
    
    int main(){
        int x, y, maxval;
        
        printf("Input two numbers:");
        scanf("%d %d", &x, &y);
    
        maxval = fun(max,x,y);
        printf("Max value: %d\n", maxval);
    
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    运行结果:

    Input two numbers:5 8
    Max value: 8
    
    • 1
    • 2

    maxval = fun(max,x,y)将函数max的入口地址传给了fun的形参pfun,调用pfun实际就调用了函数max。


    1.5 函数指针数组

    函数指针数组是一个元素均为函数指针的数组。

    #include 
      
    //返回两个数中较大的一个
    int max(int a, int b){
        return a>b ? a : b;
    }
    
    //返回两个数中较小的一个
    int min(int a, int b){
        return a<b ? a : b;
    }
    
    int main(){
        int x, y, maxval, minval;
    
        int(*arr[2])(int x, int y) = { max, min};
        printf("Input two numbers:");
        scanf("%d %d", &x, &y);
    
        maxval = arr[0](x,y);
        printf("Max value: %d\n", maxval);
        minval = arr[1](x,y);
        printf("Min value: %d\n", minval);
    
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    运行结果:

    Input two numbers:5 8
    Max value: 8
    Min value: 5
    
    • 1
    • 2
    • 3

    int(*arr[2])(int x, int y) = { max, min}定义的是一个指针函数数组,数组两个元素分别为函数max和函数min的地址,调用数组arr元素实际就调用了对应函数,这一点始终没变。


    2. 指针函数

    2.1 概念定义

    指针函数是非常常见的,它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有“函数返回值”,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。

    例如: int *fun(x,y); 其结构为 类型标识符 函数名(参数)
    fun是一个函数,只是返回值是一个int型的指针,如果不加
    ,它依然是一个函数,只是返回值是一个int整型数。


    2.2 调用方法

    #include 
      
    //返回两个数中较大的一个
    int *max(int *a, int *b){
        int *ptr;
    
        ptr = *a>*b ? a : b;
        return ptr;
    }
    
    int main(){
        int x, y, *maxval;
    
        printf("Input two numbers:");
        scanf("%d %d", &x, &y);
    
        maxval = max(&x,&y);
        printf("Max value: %d\n", *maxval);
    
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    运行结果:

    Input two numbers:5 8
    Max value: 8
    
    • 1
    • 2

    int *max(int *a, int *b)为指针函数,它与普通整型函数或字符型函数并没很大区别,只是函数返回为指针ptr。

    3. 总结

    指针函数本质是一个函数,其返回值为指针。
    函数指针本质是一个指针,其指向一个函数。
    指针函数:int* fun(int x,int y);
    函数指针:int (*fun)(int x,int y);
    *与函数名在括号内,表明指针作用于函数本身,*与函数名不在括号内,表明指针作用于函数返回值。

  • 相关阅读:
    YOLO目标检测——棉花病虫害数据集+已标注txt格式标签下载分享
    使用micronaut创建基于maven的web工程集成jpa实现crud
    精准定位,智慧港口:北斗技术在港口车辆智能监管中的应用
    dataHost标签详解
    洛谷P5613 黑蚊子多
    Ubuntu右上角的红色圆圈报错的问题解决
    路飞项目day1
    这几款好用的办公工具,你们还不知道吗?
    _linux 进程间通信(命名管道)
    新版Testwell CTC++带来哪些新变化?
  • 原文地址:https://blog.csdn.net/NoBack7/article/details/126003661