论函数指针
函数指针是一种特殊的指针,指向函数的内存地址,允许通过指针来调用函数。
1.函数指针的声明与定义
需要指定:
被指向函数的返回值类型
被指向函数的参数类型列表(不需要参数名)
语法格式:
返回值类型(* 指针变量名)(参数类型1,参数类型2,...);void (*fun)(int);
为什么只需要传入函数参数类型?
1.函数指针的本质是”函数类型的抽象“
函数指针的作用是指向具有特定“调用形式”的函数,而“调用形式”由两部分决定:
参数的类型序列(如(int,double))
返回值类型(如void、int)
参数名只是函数定义时的局部标识符,用于函数内部逻辑处理,并不影响函数的“调用形式”。
2.函数指针的声明是“类型匹配”的约定
函数指针声明的语法本质上是一种类型约定v:它规定了“被指向函数必须接受什么类型的参数,返回什么类型的值”。
3.参数名在函数指针中是“冗余信息”
函数指针的作用是传递函数的“调用入口”,而不是传递函数的实现细节。当通过函数指针调用函数时,实际传递的是参数的值,编译器只需要确保参数的类型与函数指针声名的参数类型一致。
2.函数指针作为函数参数(回调函数)
函数指针最常用的场景是作为其他函数的参数,实现“回调机制” ——让被调用的函数反过来调用传入的函数。
#include <iostream>
#include <vector>using namespace std;void PrintValue(int value)
{cout << "value :" << value << endl;
}void ForEach(const vector<int>& values,void (*func)(int))
{for(int value : values)func(value);
}int main()
{vector<int> values ={1,3,5,2,4};ForEach(values,PrintValue);return 0;
}
3.函数指针与Lambda
#include <iostream>
#include <vector>using namespace std;void ForEach(const vector<int>& values,void (*func)(int))
{for(int value : values)func(value);
}int main()
{vector<int> Value ={1,3,2,4,5};ForeEach(Value,[](int value){cout << "value :"<<value << endl;});return 0;
}
4.函数指针的注意事项
类型严格匹配:函数指针的参数类型、返回值类型必须与被指向的函数完全一致,否则会编译错误
避免指向空或失效函数:未初始化的函数指针或指向已销毁函数的指针(如局部函数)调用时会导致未定义行为
简化声明:复杂的函数指针可以用typdef或using简化:
//定义别名
using FunPtr = void (*)(int);//等价于 typedef void (*FunPtr)(int);//使用别名
FunPtr ptr = print_num;