不同数组声明的类型

时间:2014-09-02 13:18:47

标签: c++ c

下面的数组声明的类型是什么?谁可以清楚地告诉我,以防万一有什么价值?

int main() {
    int* arr[3];
    int(*arr)[3];
    int*(arr[3]);
}

3 个答案:

答案 0 :(得分:7)

您可以使用cdecl帮助:

  • int *arr[3]给出"声明arr为指向int"的指针的数组3。
  • int (*arr)[3]给出"声明arr作为指向int"
  • 的数组3的指针
  • int*(arr[3])给出"声明arr为指向int"的指针的数组3。

另外,当然这些并不是真实的"声明;没有终止分号,你不能在同一范围内有三个名为arr的变量。

答案 1 :(得分:3)

了解您使用的语言而不是依赖于解密源代码的工具通常是个好主意,所以我不建议使用C声明分析器。


记住优先顺序的一种简单方法是记住main的签名,即

auto main( int argc, char* argv[] )
    -> int

...你知道argv是一个指针数组(或者技术上指向这样一个数组的第一个元素的指针:声明衰减到char** argv)。

这意味着给定argv您可以将其编入索引以获取指针argv[i],然后取消引用结果以获取char,以便等效的括号声明

char* (argv[])

声明

char (*b)[3]

表示通过解除引用b,即*b,您将得到一个可以编入索引的数组(*b)[],因此b是指向数组的指针。< / p>

它不是指向此类数组的第一项的指针。它是指向数组本身的指针。因此,向b添加1会为您提供指向以下相同大小的数组的指针。

答案 2 :(得分:0)

[]和函数调用()等后缀运算符的优先级高于一元*,因此*a[N]之类的声明将被解析为*(a[N]),或“指针的N元素数组”。要声明“指向N元素数组的指针”,您需要使用数组名称或*显式地对一元(*a)[N]进行分组。

这是一张方便的图表。

T a[N]         -- N-element array of T
T *a[N]        -- N-element array of pointer to T
T (*a)[N]      -- pointer to N-element array of T
T f()          -- function returning T
T *f()         -- function returning pointer to T
T (*f)()       -- pointer to function returning T

您可以将上述内容组合成非常复杂的声明:

T (*a[N])()       -- N-element array of pointers to functions returning T
T (*f())[N]       -- Function returning pointer to N-element array of T
T (*(*f())[N])[M] -- Function returning pointer to N-element array of pointer 
                       to M-element array of T

阅读毛茸茸的宣言时,从最左边的标识符开始,然后逐步解决,记住上述规则:

      f           -- f
      f()         -- is a function returning ("()" has higher precedence than "*")
     *f()         -- a pointer to
    (*f())[N]     -- an N-element array of
   *(*f())[N]     -- pointers to
  (*(*f())[N])[M] -- M-element arrays of
T (*(*f())[N])[M] -- T