您好,我正在 C++ 中处理 2D 和 1D 数组并使用范围为访问元素。我使用的代码如下:
对于二维数组
int ia[3][4] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
for (auto& row : ia) {
for (auto col : row) {
cout << col << endl;
}
}
对于 ID 数组
int base_array[2] = { 1, 2 };
for (auto p : base_array) {
std::cout << p << std::endl;
}
正如我们在二维数组的循环外部范围中看到的,控制变量row必须是引用类型,这样数组到指针的自动转换就不会发生,并且我们可以循环遍历本身就是大小为 4 的数组的元素。但是在一维数组中我们没有使用控制变量p作为引用类型,即使这样我们也能够遍历一维数组。我的问题是为什么在一维数组中没有发生数组到指针的转换?如果控制变量不是引用类型,它是如何工作的?也就是说,为什么(如何)是p
of int
键入而不是int*
在一维数组的情况下,如果我们省略控制变量中的引用符号row然后它将变成 int* 但当我们在变量前面包含引用符号时row那么它就会变成数组类型。为什么会有这种行为差异?
在您的一维情况下, base_array 不会衰减,因为它存在于与 for 循环相同的范围内。所以基于范围的 for 可以正确地计算出它的范围。确实如此,一维并没有衰减。如果您尝试通过函数传递该一维数组,您会发现基于范围的 for 变得不可能,因为它会衰减,除非您将其作为引用传递。
在你的二维情况下,如果你允许row
衰变到int*
,嵌套的 for 不能再假设您必须表示数组。因此,您可以使用以下方法保留类型auto&
,让嵌套的 for 知道你在说什么。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)