让我们逐行看一下您的代码 sn-p 的解释。
typedef int (*Func)(); //Statement 1: This means Func is just another name for a "pointer to a function that takes no parameter and returns an int
//Here you are defining a function named A that takes no parameter and returns an int
int A(){
return 1;
}
int main()
{
Func* f = &A;//Statement 2
f = A;//Statement 3
(*f)();//statement 4
}
声明 1
这里有声明
typedef int (*Func)();
这意味着,那个
Func 只是 指向不带参数并返回int的函数的指针的另一个名称。从技术上讲,这不过是int(*)()。
声明 2
这里有声明,
Func* f = &A;
在左侧,我们定义了一个名为f 的对象,类型为Func*。也就是说,f 的类型是指向Func 的指针。但是由于Func 本身是一个指向不带参数并返回int 的函数的指针。
这意味着f的类型是
指向指针的指针,指向不带参数并返回int 的函数。从技术上讲,它只不过是int(**)()。
现在我们要看看语句 2 的右手边。但为此你必须知道这一点:
A 的类型是int(),称为函数类型。
因此,当您编写表达式 &A 时,这意味着您将得到:
指向函数类型的指针。在这种情况下是int(*)()。
为什么语句 2 有问题
所以基本上在左边你有一个int(**)() 类型的表达式,而在右边你有一个int(*)() 类型的表达式。所以类型中存在 mismatch,这正是错误所说的:
error: cannot convert ‘int (*)()’ to ‘int (**)()’ in initialization
声明 3
这里有声明,
f = A;
在左侧,您有一个 int(**)() 类型的表达式,如上文所述(在语句 2 的解释中)。特别是,f 的类型为 int(**)()
而在右手边,我们有int() 类型的表达式,如上所述(在语句2 的解释中)。特别是,由于A 是一个函数类型,并且具有int() 类型。
为什么语句 3 有问题
这里再次出现 mismatch 左侧和右侧的表达式类型,这正是错误所说的:
error: cannot convert ‘int()’ to ‘int (**)()’ in assignment
声明 4
这里有声明
(*f)();
你在这里做两件事:
-
取消引用指针f。但是由于f 的类型是int(**)(),取消引用f 的结果将是int(*)(),它只是一个指向不带参数并返回int 的函数的指针.
-
接下来,您将通过该结果指针调用该函数。在这种情况下,没有语法错误。也就是说,语句 4 中没有语法错误。
编辑
现在,既然您已将声明 2 编辑为 Func f = &A;,我将对此进行解释。
在这种情况下,在左侧,f 的类型是Func。但是因为Func 只不过是int(*)()。这意味着:
f 本身是一个指向不带参数并返回int的函数的指针。即f 的类型为int(*)()。
现在在右手边你有&A。但请注意,正如我已经解释过的,A 是一个 函数类型,在这种情况下为 int()。所以这意味着,当你写&A:
&A 是一个指向不带参数并返回int 的函数的指针。这意味着,&A 的类型为 int(*)()。
所以基本上右侧和左侧的类型匹配,在这种情况下没有错误。