通常,要声明指向特定类型的函数的指针,可以首先编写这种函数的原型,然后用(*p_fun)替换函数名。这样p_fun就是这类函数的指针。
使用函数指针调用函数时,p_fun和(*p_fun)等价。
运算符[]的优先级高于*,*p_fun[3]表明p_fun是一个包含三个指针的数组。
自动类型推断auto,只能用于单值初始化,不能用于初始化列表。但声明一个数组之后,使用auto,发现是同一个地址,且没有数组长度!!不能用于auto v1=v2[size]。
——7.10 函数指针《C++PrimerPlus》
#include <iostream>
int tadd(int, int);
int tsub(int, int);
int tmul(int, int);
void t_p_fun(int, int, int (*)(int, int));
int main(int, char **)
{
using namespace std;
int a = 8, b = 2;
cout << "-------------------函数调用------------------------" << endl;
cout << "tadd(a,b): \t" << tadd(a, b) << endl;
cout << "tsub(a,b): \t" << tsub(a, b) << endl;
cout << "tmul(a,b): \t" << tmul(a, b) << endl;
cout << "-----------------函数指针调用-----------------------" << endl;
int (*p_add)(int, int) = tadd;
cout << "p_add(a, b): \t" << p_add(a, b) << endl
<< "(*p_add)(a, b):\t" << (*p_add)(a, b) << endl;
cout << "-----------------函数指针传递-----------------------" << endl;
t_p_fun(a, b, p_add);
cout << "-----------------函数指针数组-----------------------" << endl;
int (*p_fun_arr[3])(int, int) = {tadd, tsub, tmul};
t_p_fun(a, b, p_fun_arr[0]);
cout << "-----------------auto自动推断----------------------" << endl;
auto pp_fun_arr = &p_fun_arr;
cout<< "指针数组指针\t" << (*pp_fun_arr)[0](a,b) << endl;;
cout << "-------------------范围循环------------------------" << endl;
int i = 0;
for (auto p_fun : p_fun_arr)
{
t_p_fun(a, b, p_fun);
t_p_fun(a, b, (*pp_fun_arr)[i++]);
}
cout << "-----------------typedef简化----------------------" << endl;
typedef int (*p_func)(int, int);
p_func p1 = tadd;
t_p_fun(a, b, p1);
return 0;
}
void t_p_fun(int a, int b, int (*p_fun)(int, int))
{
using namespace std;
cout << "p_fun(a, b): \t" << p_fun(a, b) << endl;
// << "(*p_fun)(a, b):\t" << (*p_fun)(a, b) << endl;
}
int tadd(int a, int b)
{
return a + b;
}
int tsub(int a, int b)
{
return a - b;
}
int tmul(int a, int b)
{
return a * b;
}