【问题标题】:What is int (*fp)() [duplicate]什么是 int (*fp)() [重复]
【发布时间】:2019-06-30 03:22:05
【问题描述】:

我不熟悉下面struct的语法

struct fp {
  int (*fp)();
}

int (*fp)() 是什么?我知道这是一个 integer*fp 是一个指针,但我不明白 (*fp)() 中的括号是做什么的。

【问题讨论】:

标签: c


【解决方案1】:

这是一个function pointer。如果您是初学者,它们功能强大且很难理解。

【讨论】:

    【解决方案2】:

    它是变量 fp 的声明,它是一个 pointer to a function,它返回一个 int 并接受一个 unspecified list of arguments

    【讨论】:

      【解决方案3】:

      这是一个包装函数指针的结构。

      看看这里:How do function pointers in C work?

      【讨论】:

        【解决方案4】:

        fp 是指向具有空参数列表的函数的指针。

        int myfunc()    //define function
        {
            return 0;
        }
        
        struct fp    //define structure
        {
          int (*fp)();
        } mystruct;
        mystruct.fp = &myfunc;    //assign function pointer to structure element
        
        int a = mystruct.fp();    //Call function through pointer
        

        有很多方法可以读取 C 声明,在某些情况下可能会非常复杂。开始阅读这个https://parrt.cs.usfca.edu/doc/how-to-read-C-declarations.html

        您可以在 Google 上搜索“如何阅读 c 声明”以获得更深入的解释和更多提示。

        正如 Swordfish 所指出的,空参数列表的使用暗示了有关函数定义的其他明智点,这可能值得深入。有关函数定义的要点,请参阅下面 Swordfish 的评论。

        我将仅参考 §6.11.6 函数声明符§6.11 未来语言方向):

        使用带空括号的函数声明符(不是 原型格式参数类型声明符)已过时 功能。

        【讨论】:

        • 空参数列表 - 可能会产生误导。
        • @Swordfish 我同意,但问题是空的 参数列表(不仅仅是没有参数)是该语言的另一个复杂性。虽然它来自旧的 ANSI 标准(出于兼容性原因仍然保留),但可能至少有 2 种不同的含义:根本没有参数,或变量编号(可变参数函数)。所以我不会再增加答案的复杂性。或者你有什么不同的建议?
        • 也许至少提到空参数列表现在已经贬值了很长时间,不应再在新代码中使用。使用示例中的函数指针类型,只要在调用时提供正确数量和类型的参数,就可以调用返回 int 的每个函数。但接下来就是默​​认参数促销:/
        • @Swordfish 你说的!只是稍微详细一点,我们淹没在:编程风格,或不良的编程习惯,函数定义,ANSI 合规性,未来的语言方向等。无论如何我认为你的评论已经是一个贡献,并在答案中引用它.
        猜你喜欢
        • 2021-08-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-02
        • 1970-01-01
        • 1970-01-01
        • 2021-05-04
        • 2021-03-16
        • 1970-01-01
        相关资源
        最近更新 更多