c - 这两个指针有何不同?

标签 c function pointers integer

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

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

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

int (*func)()

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

最佳答案

int *func(void)

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

int(*func)(void)

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

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

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

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

也试试 cdecl: C gibberish ↔ English .这是 cdecl 实用程序的一个很好的实现。

enter image description here

关于c - 这两个指针有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17524829/

相关文章:

c++ - 示例代码中的范围问题,使用分隔符将字符串的std::string拆分为std::vector

java - 如何确保函数在调用它的函数完成后运行?

C++:将字节缓冲区转换为另一种类型时的对齐

c - 如何使用指针在 c 中编写自己的 strchr?

php - 调用具有多个变量的函数

c - 如何从指针读取 64 位到 8 位值

c++ - XShmPutImage 事件通知挂起

c - 初始化一个包含指向结构体指针的结构体

Java - C-Like Fork?

c - 在 C 中使用结构 - 无法访问值