博客总结 :
之前的博客 【C 语言】指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方式 | 字符串 | 指针数组 | 数组指针 | 多维数组 | 多维指针 | 数组参数 | 函数指针 | 复杂指针解读) 六. 函数指针 章节中 , 详细介绍了 函数指针 , 以及 函数指针 与 数组 , 其它指针 结合的 复杂指针如何进行解读 ;
" 函数指针 " 是一种 指向函数的指针 , 表示的是 函数地址 , 其指向 函数 而不是 内存数据 ;
借助 " 函数指针 " 可以用来调用函数 ;
" 函数指针 " 也可以 作为函数的 参数 ;
" 函数指针 " 定义语法 :
return_type (*func_ptr)(parameter_list);
" 函数指针 " 示例 : 下面的 函数指针 p 指向一个函数 , 函数的参数是 2 个 int 类型参数 , 函数的返回值是 int 类型 ;
int (*p)(int, int);
定义 int (*)(int, int)
类型的函数指针 , 将如下函数赋值给函数指针
int add(int a, int b) {
return a + b;
}
可以将 add 直接赋值给函数指针 ,
也可以先使用 & 符号获取 函数地址 &add , 然后再赋值给函数指针 ;
// 定义 函数指针 , 将函数地址赋值给 函数指针
int (*func_ptr)(int, int) = add;
int (*func_ptr2)(int, int) = &add;
上述两种赋值都是正确的 , 通过 func_ptr(1, 2) 和 func_ptr2(1, 2) 代码 , 都可以调用到函数 ;
函数指针完整代码示例 :
// 包含 C++ 头文件
#include "iostream"
// 使用 std 标准命名空间
// 该命名空间中 , 定义了很多标准定义
using namespace std;
// 定义一个函数
int add(int a, int b) {
return a + b;
}
int main()
{
// 定义 函数指针 , 将函数地址赋值给 函数指针
int (*func_ptr)(int, int) = add;
int (*func_ptr2)(int, int) = &add;
// 打印 调用结果
cout << "func_ptr(1, 2) = " << func_ptr(1, 2)
<< " , func_ptr2(1, 2) = " << func_ptr2(1, 2) << endl;
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
}
执行结果 :
func_ptr(1, 2) = 3 , func_ptr2(1, 2) = 3
Press any key to continue . . .
对 函数指针 进行赋值时 , 直接将 函数名 赋值给了 函数指针 ;
如 下面的代码中 , 直接将 add 函数赋值给了 函数指针 func_ptr ;
int (*func_ptr)(int, int) = add;
如果 代码中 定义了多个 add 重载函数 , 那么 使用 重载函数 对 函数指针 进行赋值 , 就需要进行类型匹配了 ;
使用 int (*func_ptr)(int, int)
代码 , 定义的 函数指针 有 2 个 int 类型的参数 , 有 1 个 int 类型的返回值 ;
为该函数指针 赋值 add 函数 时 , 就会自动 查找 参数列表是 2 个 int 类型的函数 ,
完整代码示例 :
// 包含 C++ 头文件
#include "iostream"
// 使用 std 标准命名空间
// 该命名空间中 , 定义了很多标准定义
using namespace std;
// 定义一个函数
int add(int a, int b) {
return a + b;
}
// 定义一个函数
int add(int a, int b, int c) {
return a + b + c;
}
int main()
{
// 定义 函数指针 , 将函数地址赋值给 函数指针
// 对函数指针进行赋值时 , 会根据函数指针的类型匹配 add 函数
// 显然会匹配到 int add(int a, int b) 函数的地址
int (*func_ptr)(int, int) = add;
// 对函数指针进行赋值时 , 会根据函数指针的类型匹配 add 函数
// 显然会匹配到 int add(int a, int b, int c) 函数的地址
int (*func_ptr2)(int, int, int) = add;
// 打印 调用结果
cout << "func_ptr(1, 2) = " << func_ptr(1, 2)
<< " , func_ptr2(1, 2) = " << func_ptr2(1, 2, 3) << endl;
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
}
执行结果 :
func_ptr(1, 2) = 3 , func_ptr2(1, 2) = 3
Press any key to continue . . .