繁体   English   中英

C ++ 2D数组起作用-为什么第二个索引不能变量

[英]C++ 2D array to function - Why second index cannot be variable

采取此代码。

using namespace std;
int x = 10;

void test(int arr[][x]);

int main() {
   int mainArr[4][x];
   testFunc(mainArr);
}

void test(int arr[][x]) {
     ...
}

现在,此代码不起作用。 我收到一条错误消息note: candidate function not viable: no known conversion from 'int [4][10]' to 'int (*)[x]' for 1st argument void test(int arr[][x]);' 现在,我知道,如果我每次看到x都替换为10时,它将起作用,但这不是我要的。 我问为什么C ++不允许我们将变量放入函数定义中? 我觉得我不了解c ++处理全局变量,2d数组和/或函数定义的方式,如果有人可以填写我不了解的内容,我将不胜感激,因为我认为上面编写的代码应该可以能够编译。 谢谢。

当数组传递给函数时,它只是传递一个指向数组开头的指针。 如果函数不知道所有低阶维度的大小,则它将无法计算数组中各项的地址。

例如,如果您的函数中有一个对arr[3][4]的引用,那么如果知道较低的尺寸为10,则可以进行3 * 10 + 4的计算以计算该项目的位置。

其他类型具有附加的数据,这些数据可以包含诸如每个维的大小之类的信息,但C / C ++数组并非如此。

如果您想知道为什么它不能仅使用全局值,那是因为它需要在编译时知道该值。 如果将声明更改为:

const int x = 10;

然后,使用代码就可以了,因为它知道x始终为10,因此可以在编译时将其考虑在内。

C风格只是不允许在C ++中使用。 C样式的数组必须具有恒定的尺寸。 无论如何,不​​鼓励使用它们。 它们主要来自C语言的历史遗迹。

C ++中其大小在编译时未知的数组的名称为vector 您的代码可能如下所示:

int x = 10;

void testFunc(vector<vector<int>> &x);

int main() 
{
    vector<vector<int>> mainArr{ 4, vector<int>{x} };
    testFunc(mainArr);
}

如果4并不需要改变,你可以使用array<vector<int>, 4>代替,或使4模板参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM