2014-09-02 56 views
-4

下面的数组声明的类型是什么?谁能为我清楚说明什么价值?不同数组声明的类型

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

http://c-faq.com/decl/spiral.anderson.html – chris 2014-09-02 13:19:06

+3

http://cdecl.org/ – P0W 2014-09-02 13:20:20

+2

第一个和第三个是一样的。 – 2014-09-02 13:21:02

回答

7

您可以使用cdecl助阵:

  • int *arr[3]赋予 “声明改编为指针数组3为int”。
  • int (*arr)[3]给出 “声明ARR作为指针整型阵列3”
  • int*(arr[3])给出 “声明ARR作为指针的阵列3为int”。

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

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是一个指向数组的指针。

它’ s不是指向此类数组的第一项的指针。它是’的一个指向的阵列本身。因此,将1加到b会给你一个指向相同大小的后续数组的指针。

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