这两个指针是如何相互不同的?

时间:2013-07-08 10:53:31

标签: c function pointers integer

我是C语言和一般指针的新手。所以我对这两件事的理解是基本的。

我一直在尝试创建一个能够保存函数指针的结构,没什么特别的。这样做;我注意到这句话:

int *func()
不起作用。而这一个确实有效:

int (*func)()

他们之间有什么区别?是因为第一个语句只是一个指向整数的指针。而另一个指针以某种方式指向一个函数?怎么样?

1 个答案:

答案 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实用程序的一个很好的实现。

enter image description here