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