int *(*ptr)()——指向函数的指针

1 篇文章 0 订阅

int *(*ptr)()


前言

在面试的过程中可能会遇到以下问题:

在这里插入图片描述

这里我总结了一个规律:去掉*变量名,剩下的即指针所指向的类型。

本文题目为 int *(*ptr)()
这是一个什么呢?

如果不问你这是啥,而是问指针指向的类型,就可以套用上面的规律:
答:int *()()

如果问这是什么东西,指向哪里,返回值是什么,就需要往下学习了。


提示:以下是本篇文章正文内容,下面案例可供参考

Part1:答案

  1. 由于小括号的运算级比较高,结合方法又是自左向右,所以先运算 (*ptr),表明定义了一个指针 ptr
  2. 接下来再运算最右边的小括号(),表明是一个函数。
  3. 下一步运算 *(*ptr)(),表明函数的返回值是一个指针。

int *(*ptr)() 定义了一个指针变量 ptr,它指向一个没有参数,并且返回值是一个整型指针的函数。

ptr 就是指向函数的指针。

Part2:知识点讲解

示例代码如下:

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

调用方式:

Sum(1, 2);

想要表示函数的指针,可以用 &Sum,可以将 Sum 前边的地址操作符 & 去掉,对于普通函数,地址操作符 & 是可选的。


2.1 函数指针变量

//声明一个函数指针,可以将FnName理解为新定义的变量
int (*FnName)(int, int);

// 将Sum函数的地址赋给它
Fnname = ∑

// 函数调用
(*FnName)(3, 5);

首先声明了一个函数指针变量。

格式为:返回类型 (*函数指针变量) (参数列表);

然后将Sum函数的地址赋给函数指针变量。

注意:只有两个函数指针参数类型和返回值类型完全相同才可以赋值;注意:修饰符 const& 等不同也会导致赋值失败。

最后是函数调用。

调用格式:(*函数指针变量) (实参列表);

2.2 函数指针类型

前面介绍了函数指针变量的声明,那么函数指针类型如何声明呢?

在函数指针声明前面加个 typedef 就成了函数指针类型定义。

代码如下:

// 声明一个函数指针类型
typedef int (*FnType)(int, int);

// 定义一个FnType类型的变量并赋值
FnType fb = ∑

// 函数调用
(*fb)(3, 5);

首先声明了一个函数指针的类型,FnType 便是新声明的类型,他是函数指针的类型。

然后定义了一个该类型的变量,并将 Sum 函数的地址赋值给它。

最后是函数调用。


进阶代码:

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

typedef int (*FnType)(int, int);
int Fun1(FnType ft, int x, int y)
{
 	return (*ft)(x, y);
}

// 函数指针可以定义在参数列表中,在函数体内使用
int Fun2(int (*fn)(int, int), int x, int y)
{
 	return (*fn)(x, y);  
}
 
int main()
{
 	cout << Fun1(&Sum, 2, 3) << " ";  // 输出 5
 	cout << Fun2(&Sum, 3, 4) << "\n"; // 输出 7
 	return 0;
}

总结

你要不断地成长,唯有 grow up 才能抵御住 grow old
你会慢慢的活成一束光,谁若接近你,便是接近光。

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值