下面的数组声明的类型是什么?谁可以清楚地告诉我,以防万一有什么价值?
int main() {
int* arr[3];
int(*arr)[3];
int*(arr[3]);
}
答案 0 :(得分:7)
您可以使用cdecl帮助:
int *arr[3]
给出"声明arr为指向int"的指针的数组3。int (*arr)[3]
给出"声明arr作为指向int" 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