函数指针

函数指针

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 定义的类型别名 与函数指针区分开来,我们将别名用大写字母开头的方式来表示:

posted @ 2025-01-20 00:07  爱新觉罗LQ  阅读(11)  评论(0)    收藏  举报