函数指针和指针函数:超详解——函数指针形参

函数指针:

函数指针 的本质是一个指针,该指针的地址指向了一个函数,所以它是指向函数的指针。

int (*test)()

指向的是函数而非对象。和其它指针一样,函数指针指向某种特定类型。函数的类型由它的返回类型形参类型共同决定。与函数名无关

void show(int a);      //想要声明一个可以指向该函数的指针,只需用指针替换函数名即可

void(*print)(int a);        //print指向一个函数,该函数由一个int形参,返回值是void类型

1,使用函数指针

当有与指针相同类型的函数时,直接赋值即可:

    print = show;          //print1指向名为print的函数
    print = &show;         //等价的赋值语句:取地址符是选的
    print = 0;           //也可以赋值为零,表示不指向任何函数

    int a = 0;
    print(a);         //此时便可直接使用print来代替show

2,重载函数的指针

如果想要指向重载函数,则必须清除的界定应该指向哪个函数

void test(int a);
void test(char a);
void test(double a);          //test的重载函数

//void(*test1)(unsigned a) = test;        错误,因为test的重载函数中,没有unsigned类型的       
void(*test1)(char a) = test;         //正确,指向第二个test重载函数

3,函数指针形参

即把函数当作形参传入

  • void test(int a,int b,int print(int a));      //第三个函数类型会自动转换为指向函数的指针
  • void test(int a,int b,int (*print)(int a));           //显示的将形参定义为指向函数的指针

使用:

  • test(a, b, print1);          //直接把函数print1当作实参使用,会自动转化为指针

还可使用decltype来简化使用函数指针代码

#include<iostream>
using namespace std;

int compare(int a,int b)
{
	return a > b ? a : b;
}

//三种相同的方法
void test(int a, int b, int compare(int, int))
{
	cout << a + (compare)(a, b) << endl;
}
void test1(int a, int b,int pf(int,int))        //函数类型,会自动转换成指向函数的指针
{
	cout << a + (*pf)(a,b) << endl;
}
void test2(int a, int b, int(*pf)(int, int))       //显示的将形参定义成指向函数的指针
{
	cout << a + (*pf)(a, b) << endl;
}


int m1(int, int);
typedef decltype(compare) compare1;      //等价的类型:函数类型
int(*m2)(int, int);
typedef decltype(compare) *compare2;     //等价的类型:指向函数的指针

void test11(int a, int b, compare1 x)     //等价的类型:函数类型  
{
	cout << a + (*x)(a, b) << endl;
}
void test21(int a, int b, compare2 x)     //等价的类型:指向函数的指针
{
	cout << a + (*x)(a, b) << endl;
}


int main()
{
	int a = 10, b = 20;
	test(a, b, compare);
	test1(a, b, compare);
	test2(a, b, compare);
	test11(a, b, compare);
	test21(a, b, compare);
	system("pause");
	return 0;
}

4,返回指向函数的指针

和数组类似,虽然不能返回一个函数,但是能返回指向函数类型的指针。然而我们必须把返回类型写成指针形式,编译器不会自动地将函数返回类型当成对应的指针类型处理

int (*ff(int)) (int *,int);表示:ff(int)是一个函数,带有一个int型的形参,该函数返回int (*) (int *,int),它是一个指向函数的指针,所指向的函数返回int型并带有两个分别是Int*和int型的形参。

(下面内容是从网上看了好久,感觉相对比较好的回答)

第一个硬刚,就是直接定义,那么需要你对c的声明方式比较熟悉。比如我声明一个函数,这个函数没有参数,返回值是一个函数指针,它指向一个参数为int,返回值为int的函数。可能绕了点,多读几遍就好了,那么格式如下

方法一:

int (*fun())(int);
从里面往外面去理解。最开始fun()说明是一个名叫fun的函数,没有参数。然后最外层是int (*)(int)代表fun函数的返回值。是一个指针,指向一个返回值为int,参数为int的函数。

方法二:

typedef int (*funPointer)(int);  //定义一个类型funPointer,它是一个指向函数的指针
funPointer fun();  //定义 返回值为指向函数的指针的函数

int basicFun(int para1)
{
    return para1;
}

int (*fun1())(int)
{
    return basicFun;
}

typedef int (*funPointer)(int);
funPointer fun2()
{
    return basicFun;
}

int main()
{
    printf("%d\n", fun1()(100));
    printf("%d\n", fun2()(100));
    printf("%d\n", (*fun1())(100));
    printf("%d\n", (*fun2())(100));
}

链接:c中如何定义一个“返回指向函数的指针的函数”? - 知乎

5,将auto和decltype用于函数指针类型

使用过程需要注意当decltype作用于某个函数时,它返回函数类型而并非指针类型。因此需要显示的加上*以表明我们需要返回指针,而非函数本身。

指针函数

它的本质是一个函数,不过它的返回值是一个指针。其声明的形式如下所示:

int *test(.....)

即返回值是这个函数定义的指针类型

  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大学生毕设

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值