我是 C 语言和一般指针的新手。所以我对这两件事的理解是基本的。
我一直在尝试创建一个包含指向函数的指针的结构,没什么特别的。这样做的同时;我注意到这个声明:
int *func()
不起作用。虽然这个实际上有效:
int (*func)()
他们之间有什么区别?是不是因为第一条语句只是一个指向整数的指针。而另一个指针,不知何故,指向一个函数?怎么会这样?
int *func(void)
定义一个func
没有参数的函数并返回一个指向整数的指针
int(*func)(void)
定义一个指向没有参数的函数的指针并返回一个整数
造成这种差异的原因是运算符优先级。Parerenteses 的优先级高于*
. 因此,在第一个表达式int *func()
中,函数括号具有最高优先级并被首先考虑,因此与符号相关联,func
以便编译器知道这func
是函数的符号。因此,剩下的就是回报。
在第二种情况下int(*func)()
,有一组额外的括号。在我们看到的第一个括号内*func
。由于括号是最高优先级(从左到右),编译器必须解释这个集合的内容......*func
是一个指针。好的指针指向什么?向右看,我们看到()
它是一个指向函数的指针。然后向左看返回类型。
希望这是有道理的 :) 还可以尝试如何在 CodeProject.com 上解释复杂的 C/C++ 声明。它谈到了一种叫做“左右规则”的东西,它是“......一个允许你解释任何声明的简单规则......”。它在页面的一半多一点...
也可以试试cdecl: C gibberish ↔ English。cdecl
这是该实用程序的一个很好的实现。