【问题标题】:How are these two pointers different from each other?这两个指针有何不同?
【发布时间】:2013-07-05 16:17:16
【问题描述】:

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

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

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

int (*func)()

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

【问题讨论】:

  • () 声明的函数接受未指定数量和类型的参数。这是一种过时的形式,可能不应该在新代码中使用。如果您的函数不带参数,请使用(void),而不是()。 (C++ 使用() 表示没有参数,但 C++ 是另一种语言。)

标签: c function pointers integer


【解决方案1】:
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 实用程序的一个很好的实现。

【讨论】:

  • C 中不带参数的函数实际上应该声明为(void),而不仅仅是()
  • +1。但是 cdecl.org 不需要单字符标识符。这只是一些显然必须避免的关键字(例如func,cast)。另外,我怀疑是否需要截图。
  • 啊,好吧,这就是我遇到的...假设它是单个字母
  • 突然间一切都变得有意义了。谢谢!
猜你喜欢
  • 2012-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-01
  • 2019-06-21
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多