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,所以它可以在编译时考虑到这一点。
接受这个代码。
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,所以它可以在编译时考虑到这一点。