C++函数指针与指针函数有哪些关系和区别

 更新时间:2022年08月12日 08:51:42   作者:柒号华仔  
函数指针是一个指针变量,它可以存储函数的地址,然后使用函数指针,这篇文章主要介绍了C++中函数指针与指针函数有哪些关系和区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值

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 

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

fun = &func;

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

1.3 调用方法

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

#include <stdio.h>
//返回两个数中较大的一个
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;
} 

运行结果:

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

maxval1 = (pmax)(x,y)对函数进行了调用。pmax 是一个函数指针,在前面加 * 就表示对它指向的函数进行调用。注意( )的优先级高于,第一个括号不能省略。

maxval2 = pmax(x,y),pmax就是函数max的入口地址,pmax(x,y)等同于max(x,y)。

注意这里pmax是一个指针变量,它可以指向任何函数,也就是说这里指向了函数max(),但它也可以再指向其他函数。如果我们直接调用函数名称,比如max,那么它是不可变的。

1.4 函数指针作为函数参数

#include <stdio.h>
//返回两个数中较大的一个
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;
}

运行结果:

Input two numbers:5 8
Max value: 8

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

1.5 函数指针数组

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

#include <stdio.h>
//返回两个数中较大的一个
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;
}

运行结果:

Input two numbers:5 8
Max value: 8
Min value: 5

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 <stdio.h>
//返回两个数中较大的一个
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;
}

运行结果:

Input two numbers:5 8
Max value: 8

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

3. 总结

指针函数本质是一个函数,其返回值为指针。

函数指针本质是一个指针,其指向一个函数。

指针函数:int* fun(int x,int y);

函数指针:int (*fun)(int x,int y);

*与函数名在括号内,表明指针作用于函数本身,*与函数名不在括号内,表明指针作用于函数返回值。

到此这篇关于C++函数指针与指针函数有哪些关系和区别的文章就介绍到这了,更多相关C++函数指针内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Qt快速读取大文件最后一行内容解决方案

    Qt快速读取大文件最后一行内容解决方案

    这篇文章主要给大家介绍了关于Qt如何快速读取大文件最后一行内容的解决方案,文中通过代码介绍的非常详细,对大家学习或者使用Qt具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-01-01
  • C++中stack容器的使用

    C++中stack容器的使用

    本文主要介绍了C++中stack容器的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Visual Studio 2019 如何新建 Win32项目的方法步骤

    Visual Studio 2019 如何新建 Win32项目的方法步骤

    这篇文章主要介绍了Visual Studio 2019 如何新建 Win32项目的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • OpenCV图像处理之直方图比较方法详解

    OpenCV图像处理之直方图比较方法详解

    直方图比较是对输入的两张图像进行计算得到直方图H1与H2,归一化到相同的尺度空间,然后可以通过计算H1与H2的之间的距离得到两个直方图的相似程度,进而比较图像本身的相似程度。本文将为大家详细讲讲直方图比较的实现方法,需要的可以参考一下
    2022-09-09
  • C++实现LeetCode(95.独一无二的二叉搜索树之二)

    C++实现LeetCode(95.独一无二的二叉搜索树之二)

    这篇文章主要介绍了C++实现LeetCode(95.独一无二的二叉搜索树之二),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • c语言使用fdk_aac实现aac音频解码为pcm

    c语言使用fdk_aac实现aac音频解码为pcm

    这篇文章主要为大家详细介绍了c语言如何使用fdk_aac库实现aac音频解码为pcm的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-11-11
  • C语言中动态内存管理图文详解

    C语言中动态内存管理图文详解

    在编写程序时,通常并不知道需要处理的数据量,或者难以评估所需处理数据量的变动程度,下面这篇文章主要给大家介绍了关于C语言中动态内存管理的相关资料,需要的朋友可以参考下
    2022-06-06
  • C++实现十六进制字符串转换成int整形值的示例

    C++实现十六进制字符串转换成int整形值的示例

    今天小编就为大家分享一篇关于C++实现十六进制字符串转换成int整形值的示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • Opencv EigenFace人脸识别算法详解

    Opencv EigenFace人脸识别算法详解

    这篇文章主要为大家详细介绍了Opencv EigenFace人脸识别算法的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • C++知识点之成员函数中const的用法

    C++知识点之成员函数中const的用法

    这篇文章主要介绍了C++知识点之成员函数中const的用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11

最新评论