Fork me on GitHub

C++11 函数指针、指针函数、返回值为函数指针的函数

C++函数指针、指针函数、返回值为函数指针的函数

一、函数指针

​ 函数指针是一种特殊的指针,指向函数函数返回一个类型

​ 例如int (*add)(int,int)定义了一个函数指针add,指向一个函数,函数形参是int/int,返回值是int。

​ 例如int (*pfun)(int,int),意味着pfun是一个指针,指向一个函数,函数的返回值是int。

#include <iostream>
using namespace std;

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

int main()
{
    int (*add)(int, int) = addfunc; //addfunc函数名转换成函数指针,传递给add
    //int (*add)(int ,int) = &addfunc
    
    int result = (*add)(1,2);  //解引用函数指针,调用函数
    //int result = add(1,2)  
    
    cout<<"通过函数指针调用函数得到结果"<<result<<endl;
    cout<<"直接调用函数得到结果"<<addfunc(1, 2)<<endl;
    return 0;
}

二、指针函数

​ 指针函数是一种返回值为指针的函数类型名 *函数名(函数参数列表),其中的优先级低于()。所以int *pfun(int,int) 等同于 int *(pfun(int,int)),声明了一个函数pfun,函数形参为int、int返回值为整型指针*。

#include <iostream>
using namespace std;

int *p(int, int);
//该函数返回一个整型指针
int *f(int a, int b)
{
    int *p = (int *)malloc(sizeof(int));
    memset(p, 0, sizeof(int));
    *p = a+b;
    return p;
}

int main()
{
    int *p1 = NULL;
    p1 = f(1,2); //f(1,2)返回修改后的整型指针,并传递给p1空指针
}

三、返回值为函数指针的函数

​ 这是一个复杂的指针函数,返回值为函数指针(返回值为指针,并且指针指向函数)。

int (*ff(int))(int *, int);由于优先律,前者也为int (*(ff(int))(int *, int));

​ 首先ff是函数名,ff(int)有返回值,由*可知函数返回值是指针(ff(int)当做指针变量),指针指向另一个函数,函数返回值是int。上述表达过于复杂,一般来说,我们使用typedef声明来简化代码。

int (*PF)(int *, int); //PF是一个函数指针,指向一个返回值为int的函数

typedef int (*PF)(int *,int); //作用同上,PF是一个指针,指向一个函数,有返回值,返回值类型即int
PF ff(int);//PF是函数指针,作为类型来声明ff(int)。那么ff(int)的返回值就是函数指针,即返回值为指向另一个函数的指针

//此外还有尾置指针的表示方法
auto ff(int)->int *(int *,int); //返回一个函数指针

PS 指针数组与数组指针

​ 这里补充一下指针数组和数组指针的概念。

int *point[10];
//point是一个数组,数组的10个元素都是整型指针。(指针数组)->指针构成的数组

int (*point)[10];
//point是一个指针,指向一个含有10个元素的数组,元素都是整型。(数组指针)->数组类型的指针

总结

  1. 名称后面有(),表示是函数;否则为普通变量。
  2. *后面出现的表示指针
  3. 函数名前面的void/int/char等表示返回类型
posted @ 2020-06-11 20:01  Rser_ljw  阅读(3366)  评论(1编辑  收藏  举报