不同数组声明的类型
Type of different array declarations
下面的数组声明的类型是什么?谁能清楚地告诉我万一有什么价值?
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
相关文章:
- 将类型声明为类型模板参数的模板参数的一部分是否合法?
- 当返回类型声明为 ListNode 时,我们是否可以返回 false<T>*
- 如何使用自定义类型声明Arduino数组?
- 将函数参数类型声明为 auto
- 使用typedef'ed返回类型声明友元函数时出现编译器错误
- 在没有标识符的情况下如何读取复杂的C++类型声明?
- 模板函数参数显式类型声明
- 使用指针遍历一系列基元类型声明?
- 字符类型声明和验证
- 使用本地类型声明的G lambda被使用但从未定义 - 确实是一个错误
- 为什么 c++ lambda 捕获不需要类型声明?
- 为什么没有"int"类型声明时输出不同?
- C++如何使用虚拟基类型声明全局静态分配的变量
- 我可以使用预处理器将一个类型声明替换为另一个类型声明吗?
- 如何将数据类型声明从.cpp文件传输到 .cu 文件
- C++17 枚举类型声明
- 条件类型声明
- 具有特定参数的特定构造函数的类型声明
- 我可以使用相同的名称为周围作用域中的类型声明成员类型别名吗
- 函数调用之前,C 类型声明