2

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

我一直在尝试创建一个包含指向函数的指针的结构,没什么特别的。这样做的同时;我注意到这个声明:

int *func()
不起作用。虽然这个实际上有效:

int (*func)()

他们之间有什么区别?是不是因为第一条语句只是一个指向整数的指针。而另一个指针,不知何故,指向一个函数?怎么会这样?

4

1 回答 1

9
int *func(void)

定义一个func没有参数的函数并返回一个指向整数的指针

int(*func)(void)

定义一个指向没有参数的函数的指针并返回一个整数

造成这种差异的原因是运算符优先级。Parerenteses 的优先级高于*. 因此,在第一个表达式int *func()中,函数括号具有最高优先级并被首先考虑,因此与符号相关联,func以便编译器知道这func是函数的符号。因此,剩下的就是回报。

在第二种情况下int(*func)(),有一组额外的括号。在我们看到的第一个括号内*func。由于括号是最高优先级(从左到右),编译器必须解释这个集合的内容......*func是一个指针。好的指针指向什么?向右看,我们看到()它是一个指向函数的指针。然后向左看返回类型。

希望这是有道理的 :) 还可以尝试如何在 CodeProject.com 上解释复杂的 C/C++ 声明。它谈到了一种叫做“左右规则”的东西,它是“......一个允许你解释任何声明的简单规则......”。它在页面的一半多一点...

也可以试试cdecl: C gibberish ↔ Englishcdecl这是该实用程序的一个很好的实现。

在此处输入图像描述

于 2013-07-08T10:54:52.197 回答