这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战
函数指针
函数指针顾名思义,是指向函数的指针。它的定义很简单,基本把函数在文件头部的声明改改就行:
int func(int) \\ 函数声明
int (*funcPtr)(int) \\ 函数指针初始化
funcPtr = func \\ 函数指针指向func
函数指针也蕴含一些技巧():
const double * f1(const double ar[], int n);
const double * f2(const double [], int);
const double * f3(const double *, int);
上面的三个函数的函数签名声明其实是一样的,如果想要让某个函数指针指向特定的一个函数,那么可以采取将函指针去替换函数定义的方法,如下:
const double * (*p1)(const double *, int) = f1; \\ 初始化一个指向f1的函数指针p1
auto p2 = f2; \\ 这样也可以
此处又再一次体现出了auto的优越性。
函数指针的意义和用法还有很多未能覆盖到,需要日后补充。
函数传值
传值还是传引用在任何语言中都是重要的,在C++中,函数传参有三种形式:
- 传值
- 传引用
- 传指针 对于经典的两数交换问题,三种策略的代码如下
void swapr(int & a, int & b) // 传引用
{
int temp;
temp = a;
a = b;
b = temp;
}
void swapp(int * p, int * q) // 传指针
{
int temp;
temp = *p;
*p = *q;
*q = temp;
}
void swapv(int a, int b) // 传值
{
int temp;
temp = a;
a = b;
b = temp;
}
传引用和传指针两种做法,都是可以达成交换两数的目的的,而由于函数作用域的特性,传值的做法并不会对原本的变量发生作用,而是传指针和传引用两者除了在声明和取变量以外基本是一样的。
对于传引用的函数而言,还有个特性,比方说你有个传引用的函数:
void refFunc(int &r)
如果你这样调用它
int x = 5;
refFunc(x+3)
这种方法对于一般传值函数,结果很好预见,但对于传引用函数来说,这种操作会被大多数编译器否决,而在早期的编译器中,会报出警告,实际的编译操作中,创造了一个值为x+3的变量,然后将指向原来变量的指针指向这个变量了(其实是有点不可控的做法)。