以下是代码:
#include<iostream>
using namespace std;
typedef struct ptrs
{
int (*addptr)(int a, int b);
}mems;
int add(int a, int b)
{
int result = a+b;
return result;
}
int main()
{
mems ptrtest;
ptrtest.addptr = &add;
int c = (*ptrtest.addptr)(3,4);
//int c = ptrtest.addptr(3,4);
cout << c << endl;
return 0;
}
如果我用它的下一行(现在注释)替换代码 int c =(* ptrtest.addptr)(3,4); ,结果将是相同的,为什么呢?
答案 0 :(得分:3)
当然,int c = (*ptrtest.addptr)(3,4);
是基本情况。但是,在C ++中(以及在C中),如果在函数指针上使用调用(()
)运算符,它将自动执行“解除引用”。就像分配给函数指针类型的变量一样,函数的名称会衰减为函数指针i。即
int (*fptr)() = some_func;
和
一样有效int (*fptr)() = &some_func;
虽然 func
的类型为int ()(void)
。
答案 1 :(得分:1)
函数和函数指针可以互换使用,大概是为了方便起见。特别是,C ++ 11标准的5.2.2节规定了函数调用可以使用函数或函数指针进行。
答案 2 :(得分:0)
如果这样做会产生正确的语法,C ++会自动将函数名转换为函数指针(反之亦然)。