函数指针
函数指针
int numbers[] = {1, 2, 3, 4, 5};
cout << hex << (unsigned long long)numbers << endl; // 64fcc0
对于一个函数来说,它是由一段代码组成的,这段代码也是存储在内存区域中,因此,也是可以获得函数的地址
其实函数的名称就代表了这段代码的地址
double multiply(double a, double b)
{
return a * b;
}
cout << hex << (unsigned long long)multiply<<endl; // 401d06
既然函数也有地址,那么我们也可以用指针来指向函数
返回类型 (*函数指针名称)(参数列表);
现在我们要定义一个函数指针,这个指针可以指向 multiply 函数
double (*ptr)(double a, double b);
// 对于函数指针来说,由于形参的名字没有什么作用,所以通常在声明中将参数的名称去掉
double (*ptr)(double, double);
例如这段代码中,我们定义了一个函数指针 ptr,将它初始化为函数 multiply 的地址,接下来就可以将函数指针 ptr 作为一个函数调用了
调用的方式;
- 既可以直接将函数指针当作一个函数一样使用
- 也可以使用解引用运算符 + 函数指针的形式
double res = (*ptr)(4.2, 1.5);
当我们定义一个函数指针时,定义的是这个指针所指向函数的接口形式,因此凡是符合这样接口的函数,都可以使用这样的指针来指向
以上这种函数定义方式看上去比较繁琐,所以我们通常使用 typedef 给函数指针定义一个别名
方法是:在函数指针的声明前面,加上 typedef 关键字,这样 ptr 就不再是一个变量,而是一个类型别名,也就是代表指向这样一个函数的指针类型
为了方便将 typedef 定义的类型别名 与函数指针区分开来,我们将别名用大写字母开头的方式来表示: