我该如何阅读以下声明?
How do I have to read the following statement?
我喜欢刷新我的C++技能,并尝试编写一个小对象,所以我得出了这个表达式:
int (*const vectors)[2];
我该如何阅读它?我知道它正在声明一个指向二维 int 数组的常量指针。
谢谢!
你应该使用螺旋规则来解析int (*const vectors)[2];
:
- 从标识符
vectors
开始 - 处理其右侧的一元运算符,从左到右,")"之前没有 。
- 处理其左侧的限定符和一元运算符,从右到左:
const
表示vectors
是常量,则无法修改其值。*
表示指针:vector
是一个常量指针
- 跳过两侧的括号,重新开始:
[2]
表示2 的数组。vector
是指向一个或多个 2 个数组的常量指针- 最后:
int
给出内部元素类型。
vector
是指向一个或多个 2 个int
数组的常量指针。
因此,vector
可以指向 2 个int
数组的数组。例如,您可以使用vector
通过以下方式操作 2D 矩阵:
// allocate a 2D identity matrix:
int (*const vectors)[2] = malloc(sizeof(int[2][2]);
vectors[0][0] = vectors[1][1] = 1;
vectors[1][0] = vectors[0][1] = 0;
但请注意,vectors
必须初始化,而不是分配,因为它被定义为const
。如果打算让vectors
指向不应修改的 2D 矩阵(例如作为函数参数),则声明应为:
void print_matrix(const int (*vectors)[2]);
或
void print_matrix(int const (*vectors)[2]);
最后,const
在 C 和 C++ 中的含义存在细微差异,但上述解析方法适用于这两种语言。
在声明中,前缀*
和后缀[]
都是修改标识符(或声明符)的运算符。
问题是[]
的优先级高于*
,所以如果你省略了括号,你会将vectors
声明为数组大小为 2 的int * const
。
需要括号才能使vectors
成为指向int [2]
的常量指针。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 未在作用域中声明unordered_map
- C++避免重复声明的语法是什么
- 循环后如何继续阅读
- 如何确保C++函数在定义之前声明(如override关键字)
- 用c++阅读音频
- 错误:未在此范围内声明'reverse'
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 为什么在定义函数之前先声明它
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- #ifdef和未声明的标识符
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 没有显式声明的int[]中的foreach
- 在基于范围的for循环中使用结构化绑定声明
- 我该如何阅读以下声明?
- 在C++中声明可见性/访问权限的方法有何不同
- 如何阅读此运算符声明和实现
- clang与gcc在查找声明方面有何不同
- Arduino FSR 阅读草图 - 模拟阅读' 未在此范围内声明
- 阅读复杂const声明的简单规则