为什么二维数组中的Range是这样写的
Why the Range for in a two-dimensional Array is written in this way?
这是github.com/pezy/CppPrimer.上的一个小程序
int ia[3][4] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
// a range for to manage the iteration
for (const int(&p)[4] : ia)
for (int q : p) cout << q << " ";
cout << endl;
只是想知道为什么在的范围中使用const int(&p)[4]。
我本来打算使用for(int p[4] : ia)
,因为我认为这样p
就会变成int[4]
,所以无论是通过值还是通过引用,当q
访问p
中的每个元素时,它都会在下一行中工作。但当我尝试for(int p[4] : ia)
时,编译器说不能使用int*
初始化int[]
。我只是不知道为什么。
更进一步,我知道这个代码不会工作:
int i = 10;
int *c= &i;
int &p = c;
引用不能由指针初始化,但根据编译器给出的错误,似乎正是这种情况。
在循环机制的范围内(此处描述),会发生类似的情况:
int ia[3][4] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
// begin is deduced to be an int (*)[4]
auto begin = ia, end = ia + 12;
// Hence *begin is an int (&)[4]
int p[4] = *begin;
但是,无法从另一个数组复制初始化数组,因此代码无法编译。
您得到的错误消息是因为编译器试图将*begin
(对行的引用)衰减为指向该行第一个元素的指针,但由于同样的原因失败了。
然而,工作示例最终是:
const int (&p)[4] = *begin;
它使用另一个相同类型的引用初始化一个引用,并添加一个const
。这是完全正确的。
for(int p[4] : ia)
将尝试复制数组。这在C++中是不允许的。
for(const int(&p)[4] : ia)
使用引用来迭代数组,并且不复制它们的元素。第二个代码片段:
int &p = c;
p
是对int
的引用,它不能引用对int
的指针。以下内容有效:
int *&p = c; // reference to c
int &r = *c; // reference to int pointed to by c
相关文章:
- 将值从二维数组输出到文本文件
- 在二维数组中查找最小值和最大值?
- 移动二维数组中的字符
- 如何正确填充在堆上分配的二维数组?
- 传递二维数组时出现问题
- 具有随机数的二维数组不会更改
- 如何在C++中获取二维数组中最少的一列数?
- 如何使用用户输入变量制作二维数组?
- C++ 中动态二维数组的访问冲突
- 遍历二维数组的所有子数组
- 将二维数组的所有元素插入到一维数组中
- 在函数中传递二维数组
- 为什么指针在对二维数组进行排序时无法正常工作?
- 创建 std::string 的二维数组的最佳做法
- 如何将文本文件读取到二维数组中并以 c++ 打印
- 元素在二维数组 c++ 中的出现次数
- 执行 c++ 二维数组
- C++ 中的二维数组初始化为一个值
- 在C++中初始化第一维大小未知的二维数组
- 为什么二维数组中的Range是这样写的