【问题标题】:Complicated declarations (of C) [duplicate]复杂的声明(C)[重复]
【发布时间】:2013-01-20 16:21:51
【问题描述】:

可能重复:
How to understand complicated function declarations?
Spiral rule and ‘declaration follows usage’ for parsing C expressions

您可能已经阅读过K&R's The C Programming Language 书中的同名部分“复杂声明”。我只是在读这本书,并试图用 C 语言提高自己。在阅读了提到的部分之后,我想我无法理解 C 声明语句语法背后的逻辑。 1、2、3 和 4 来自第 5 节,第 6 节来自其他页面。

  1. int (*daytab)[13] daytab:指向 int 数组 [13] 的指针

  2. void (*comp)() comp: 指向返回 void 的函数的指针

  3. char (*(*x())[])() x: 函数返回指针数组[] of pointer to function return char

  4. char (*(*x[3])())[5] x: 指向函数的指针的数组 [3] 返回指向数组 [5] 的指针 字符

  5. typedef int (*PFI)(char *, char *) 创建类型 PFI,用于 ``指向函数的指针(两个字符 * 参数)返回 int。语法在这里如何工作?

最后,我的问题是:

  • 你能解释一下你复杂的思维方式和阅读方式吗 是否可以使用上面的示例进行声明?
  • 像这样的东西吗? 1,3,4 实际可用和需要?如果可以,可以写一些代码示例吗?

【问题讨论】:

  • 你确定 int (*daytab)[13] 声明了指向 int 的指针的 daytab array[13]?
  • @PascalCuoq 它没有,它是一个指向 13 个整数数组的指针。
  • @SethCarnegie 我知道你知道这一点。我在问 OP。
  • @PascalCuoq 你是对的。谢谢。已编辑

标签: c syntax declaration


【解决方案1】:

我在过去一周左右在 HackerNews 上看到了The ``Clockwise/Spiral Rule''。这是考虑 C 声明,尤其是函数指针的好方法。

【讨论】:

    【解决方案2】:

    查看标识符和右侧旁边的符号:

    • 如果是[,则标识符用于数组。
    • 如果是(,则标识符用于函数
    • 如果是),向左看,你会发现*:标识符是一个指针
    • 如果右侧或左侧没有任何内容,则标识符是“普通旧”对象。

    阐述:

    1. int (*daytab)[13]
      daytab 是一个指针

    2. void (*comp)()
      comp 是一个指针

    3. char (*(*x())[])()
      x 是一个函数

    4. char (*(*x[3])())[5]
      x 是一个数组

    5. typedef int (*PFI)(char *, char *)
      PFI 是一个指针

    【讨论】:

    • 你能给出每个例子的完整含义吗?非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 2017-01-15
    • 1970-01-01
    • 2014-02-06
    • 2017-08-10
    • 2011-05-15
    相关资源
    最近更新 更多