【问题标题】:How to read declarations in c [duplicate]如何阅读c中的声明[重复]
【发布时间】:2014-04-03 20:12:28
【问题描述】:

所以我是刚接触 Java 的 C 新手,我想了解如何阅读声明。 我知道我举了一个例子,但我希望能够阅读所有声明并清楚地理解它。我并不是真的要求你们解决它,只是指导我

For example:
            int point *[];
            int point *()[];

【问题讨论】:

  • 看看这个:cdecl.org
  • 我们不是来当你的老师的。你可以从几乎任何一本关于 C 的书中得到这个。我建议从第一本开始:K&R C
  • 如果您是“C 新手”,请不要标记 C++,除非您特别询问相似之处或不同之处。虽然在这里可能没有什么不同,但语言及其对问题的惯用解决方案可能非常不同。
  • 我认为您的任何一个示例都不是有效的 C 声明。 int *point[]; 可以,但 int point *[]; 没有意义。 * 需要修改一个类型——foo * 的意思是“指向 'foo' 类型对象的指针”——但是point 这里是一个变量名,而不是一个类型。

标签: c pointers


【解决方案1】:

要破译 C 声明,请使用 右 - 左规则

为你的例子int point *[]; point 是指向 int 的指针数组

首先了解符号的含义。

* // "pointer to"
[] // "array of"
() // "a function returning"

现在您知道了可以破译任何声明的符号。

例如 int *(*pointer())();`

第 1 步查找标识符

int *(*pointer())();
       ^^^^^^^

在这种情况下它是指针,所以你读作 "pointer is"

第 2 步使用左右规则

int *(*pointer())();
             ^^

你先向右移动,你会碰到(),所以你读作指针是函数返回

第 3 步继续规则

    int *(*pointer())();
          ^

然后你再次向右移动,但这里有一个右括号), 所以你向左移动标识符,在这里你有一个*,所以你读为指针是函数返回指针

第 4 步继续规则

int *(*pointer())();
                 ^^

然后你继续向左移动,但是有一个左括号(,所以你不能向左移动,所以现在你向右移动。现在你到达(),你读为指针是函数返回指向函数返回的指针

第 5 步继续规则

int *(*pointer())();
    ^             

现在你不能向右移动,因为没有更多符号了,所以向左移动并到达*, 你读为指针是函数返回指针到函数返回指针

第 6 步继续规则

int *(*pointer())();
^^^

现在你不能左右移动,因为你没有符号所以你读int, 你终于有了 指针是函数返回指针,函数返回指向int的指针

【讨论】:

  • int point *[]; 是无效的 AFAIK。一个指针数组是int *point[];
猜你喜欢
  • 2016-02-26
  • 2010-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-22
  • 1970-01-01
  • 1970-01-01
  • 2011-11-23
相关资源
最近更新 更多