不同数组声明的类型

Type of different array declarations

本文关键字:类型 声明 数组      更新时间:2023-10-16

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

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

您可以使用cdecl来帮助:

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

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

它;一般来说,了解您使用的语言是个好主意,而不是依赖工具来破译源代码,所以我不建议使用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是指向数组的指针。

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

后缀运算符(如[]和函数调用())的优先级高于一元*,因此像*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