【问题标题】:How do you decipher complex declarations of pointers+arrays?你如何破译指针+数组的复杂声明?
【发布时间】:2009-10-01 00:08:18
【问题描述】:

虽然我几乎一直使用std::vector,但我有兴趣尽可能多地了解指针。我所说的例子:

char* array[5]; // What does it mean?
// 1) pointer to an array of 5 elements!
// 2) an array of 5 pointers?

我对这个声明的准确定义感兴趣。

【问题讨论】:

    标签: c++ arrays pointers


    【解决方案1】:

    不仅仅是指针和数组:How to interpret complex C/C++ declarations:

    开始阅读声明 最里面的括号,向右走,然后 然后向左走。当你遇到 括号,方向应该是 逆转。一旦一切都在 括号已解析,跳出 其中。一直持续到整个 声明已被解析。

    左右的一个小改动 规则:当你开始阅读 第一次声明,你 必须从标识符开始,并且 不是最里面的括号。

    你的例子:

    char* array[5];
    

    是一个由 5 个指向 char 的指针组成的数组。

    【讨论】:

      【解决方案2】:

      cdecl 是一个非常适合这类事情的程序。 (特别是当您将函数指针添加到组合中时!)

      Type `help' or `?' for help
      cdecl> explain char* foo[5]
      declare foo as array 5 of pointer to char
      cdecl> declare bar as array 5 of pointer to function (integer, integer) returning char
      char (*bar[5])(int , int )
      

      【讨论】:

        【解决方案3】:

        我很久以前从一些杂志文章中学到了顺时针/螺旋规则。这是描述该技术的在线文章:

        它对我很有帮助,尽管我仍然在为我有时遇到的一些可怕的基于模板的声明而苦苦挣扎。

        【讨论】:

          【解决方案4】:

          在 C/C++ 中读取类型的一般过程是:

          1. 确定最终类型,它可以是基本类型或 typedef 标识符,并且可以具有类型修饰符,例如 const、volatile 等。在您的示例中是“char”。
          2. 将运算符应用于标识符,其优先顺序与它们在表达式中的优先顺序相同。这些运算符可以是 *(取消引用)、[](索引)和 ()(调用函数)。

          在语法的原始哲学中,您的示例应该写成“char *array[5]”,标识符是“array”,运算符是 [](索引)然后是 *(取消引用)。

          然后声明读起来就像一个合同“如果您按该顺序应用这些运算符,那么您将获得最终类型的对象”。

          在你的情况下,完整的句子是“如果你索引变量“数组”,然后取消引用结果表达式,你会得到一个字符。

          你也可以这样认为“如果你索引变量“数组”,那么你会得到一个对象,如果你取消引用它,你会得到一个字符”

          诀窍主要是跟踪 [] 和 () 的优先级高于 * 的事实。您可以像正则表达式一样使用括号控制运算符顺序。

          【讨论】:

          • 哪个优先级更高,[]还是()?
          • 这是迄今为止我找到的最清晰的解释。
          【解决方案5】:

          char * 是类型,你有一个由 5 个组成的数组。

          【讨论】:

            【解决方案6】:

            [] 的优先级高于 *,这就是为什么它是一个指针数组而不是相反的原因。

            【讨论】:

            • 哪个优先级更高,[]还是()?
            【解决方案7】:

            您总是从右到左读取指针,将“*”解释为指针。 例如 char** a[5] 是一个由 5 个指向字符指针的指针组成的数组...

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-11-11
              • 1970-01-01
              • 1970-01-01
              • 2010-11-20
              相关资源
              最近更新 更多