接受这个代码。
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++ 处理全局变量、二维数组和/或函数定义的方式,如果有人能告诉我我不理解的地方,我将不胜感激,因为我觉得我上面写的代码应该能够编译。谢谢。
最佳答案
当数组被传递给函数时,它只是传递了一个指向数组开头的指针。如果函数不知道所有低阶维度的大小,那么它将无法计算数组中项目的地址。
例如,如果您的函数中有一个对 arr[3][4]
的引用,那么如果它知道低维是 10,它可以计算 3*10 + 4 来计算该项目的位置。
其他类型有额外的数据,它们可以包含每个维度的大小等信息,但 C/C++ 数组不是这种情况。
如果您想知道为什么它不能只使用全局值,那是因为它需要在编译时知道该值。如果您将声明更改为:
const int x = 10;
那么您的代码就没问题了,因为它知道 x 始终为 10,所以它可以在编译时考虑到这一点。
关于C++ 二维数组函数 - 为什么第二个索引不能可变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29665000/