要运行的C ++ 2D数组 - 为什么第二个索引不能变量

时间:2015-04-16 03:48:20

标签: c++ c arrays function compilation

拿这个代码。

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]);'的错误消息。现在,我知道如果我每次看到它都会更换它,并且用数字10替换x。但这不是我要问的。我在问为什么c ++不允许我们将变量放入函数定义中?我觉得我不理解c ++处理全局变量,二维数组和/或函数定义的方式,如果有人可以填写我不理解的内容,我会很感激,因为我觉得我上面写的代码应该能够编译。感谢。

2 个答案:

答案 0 :(得分:1)

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

例如,如果您的函数中有一个引用arr[3][4],那么如果它知道较低的维度是10,那么它可以计算3 * 10 + 4来计算该项目的位置。

其他类型具有随附的附加数据,并且可以包含每个维度的大小等信息,但对于C / C ++数组则不是这样。

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

const int x = 10;

然后你的代码就可以了,因为它知道x总是10,所以它可以在编译时考虑到这一点。

答案 1 :(得分:0)

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设为模板参数。