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

标签 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]);'。现在,我知道如果我每次看到和 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/

相关文章:

c++ - 该代码应该返回不带空格的字符串,但它返回字符串直到第一个空格字符

c - 客户端断开连接后服务器很奇怪

java - Java 中 String 列表和 String[] 列表,或 T 列表和 T[] 列表的通用方法

c# - 通过两个参数对数组进行排序

javascript - 如何将两个数组的值获取到同一个html javascript

c++ - "invalid_grant"- 通过 C++ 中的 Google 服务帐户与 googleapi 日历交互

c++ - 带占位符的 FormatMessage

c++ - Lambda 作为 std::vector::emplace_back 的参数

C - 按字符数组字段对结构数组进行排序

c - 如何检测超出固定范围的特定值的数据