C++ 二维数组函数 - 为什么第二个索引不能可变

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++ 处理全局变量、二维数组 and/or 函数定义的方式,如果有人能补充我不理解的内容,我将不胜感激,因为我觉得我编写的代码以上应该可以编译。谢谢

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

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

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

其他类型有额外的数据,它们可以包含每个维度的大小等信息,但 C/C++ 数组并非如此。

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

const int x = 10;

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