一,函数指针
1.函数指针的概念
与数组类似,函数在内存中也有地址,函数在内存中的地址是其机器语言代码的开始位置,而函数指针则存储函数的内存地址作为变量。函数指针可以被当作一个值赋给另一个变量,也可以作为实参传递给其他函数,或者作为其他函数的返回结果。通过传递不同的函数给函数指针,可以让一个函数在不同的时间分别调用不同实现的其他函数,这些函数都有一个共同特点,那就是它们的返回值类型还有参数的类型和个数必须相同,这个类似于int类型的指针只能指向包含int值的位置。
函数指针的定义方式:
return_type (*function_pointer_name)(list_of_parameter_types);
注意,函数指针名称外面一定要有圆括号,不然就成了定义一个返回值类型为int指针的函数,样例:
int (*fun_ptr)(float*, int); //返回值类型为int的函数指针fun_ptr
int *fun(float*, int); //返回值类型为int*的函数fun
2.函数指针的初始化
方式一,使用nullptr或函数名称来初始化函数指针。
long get_max(const long* array, size_t size); //获得数组的最大值函数
long (*fun_ptr)(const long*, size_t){get_max}; //用函数名初始化的函数指针
方式二,使用auto关键字初始化函数指针。
auto fun_ptr = get_max;
auto* fun_ptr = get_max;
//以上两种方式的初始化效果是一样的,使用auto*来初始化
//可以强调fun_ptr是一个指针变量,使代码可读性更强
//也可以采用地址运算符&来显式获取函数地址
auto* fun_ptr = &get_max;
auto fun_ptr = &get_max;
方式二的初始化操作比较简单,一旦初始化完成,fun_ptr指向的函数的参数列表和返回值类型将是固定不变的。
3.函数指针调用函数
方式一,使用"(*function_pointer_name)"的方式调用,此方式向代码阅读者强调了使用的是函数指针。
long data[]{ 23, 19, 4, 50 };
long max_data = (*fun_ptr)(data,