int *(*ptr)()
前言
在面试的过程中可能会遇到以下问题:
这里我总结了一个规律:去掉*
和变量名
,剩下的即指针所指向的类型。
本文题目为 int *(*ptr)()
这是一个什么呢?
如果不问你这是啥,而是问指针指向的类型,就可以套用上面的规律:
答:int *()()
如果问这是什么东西,指向哪里,返回值是什么,就需要往下学习了。
提示:以下是本篇文章正文内容,下面案例可供参考
Part1:答案
- 由于小括号的运算级比较高,结合方法又是自左向右,所以先运算
(*ptr)
,表明定义了一个指针ptr
。 - 接下来再运算最右边的小括号
()
,表明是一个函数。 - 下一步运算
*(*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
。
你会慢慢的活成一束光,谁若接近你,便是接近光。