c++ - 如何将多维数组传递给 C 和 C++ 中的函数

标签 c++ c arrays multidimensional-array

#include<stdio.h>
void print(int *arr[], int s1, int s2) {
    int i, j;
    for(i = 0; i<s1; i++)
        for(j = 0; j<s2; j++)
            printf("%d, ", *((arr+i)+j));
}

int main() {
    int a[4][4] = {{0}};
    print(a,4,4);
}

这适用于 C,但不适用于 C++。

错误:

cannot convert `int (*)[4]' to `int**' for argument `1' to 
`void print(int**, int, int)'

为什么它在 C++ 中不起作用?需要做出什么改变?

最佳答案

此代码将在 C 或 C++ 中工作。 int[4][4] 类型的数组不能转换为 int ** 类型的指针(这就是 int *arr[] 代表在参数声明中)。如果您设法在 C 中编译它,那仅仅是因为您可能忽略了与您从 C++ 编译器获得的错误消息格式基本相同的 C 编译器警告。 (有时 C 编译器会发出 warnings 本质上是一个错误。)

因此,再次重申,不要做出不正确的断言。此代码在 C 中不起作用。为了将内置 2D 数组转换为 int ** 指针,您可以使用类似这样的技术

Converting multidimensional arrays to pointers in c++

(查看接受的答案。问题完全一样。)

编辑:代码似乎可以在 C 中工作,因为打印代码中的另一个错误正在伪装数组传递中错误的影响。为了正确访问 int ** 伪数组的元素,您必须使用表达式 *(*(arr + i) + j),或者更好的普通的 arr[i][j] (这是同一件事)。您错过了额外的 * 使其打印的内容与您的数组内容完全无关。同样,将 main 中的数组初始化为其他内容,以查看您在 C 中打印的结果与数组的预期内容完全无关。

如果您如上所示更改 printf 语句,您的代码很可能会因为我最初描述的数组传递错误而崩溃。

再一次:您不能将 int[4][4] 数组作为 int ** 伪数组传递。这就是 C++ 在错误消息中告诉您的内容。而且,我敢肯定,这是你的 C 编译器告诉你的,但你可能忽略了它,因为它“只是一个警告”。

关于c++ - 如何将多维数组传递给 C 和 C++ 中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2828648/

相关文章:

C错误: "Subscripted value is neither array nor pointer" in row echelon form

javascript - 检查数组中的元素是否已在 Javascript 中连接成对

c# - 通过套接字编程在 C# 中动态字节数组 [List<byte> 不起作用]

java - 将字符串数组从java传递给pl/sql函数

c++ - boost::beast 同步 http 客户端超时

C++ - lambda 表达式、捕获子句和类成员

c - 使用 fgets 将文件中的行读入二进制搜索树

c - 通过C输入sudo密码

c++ - 由于 HID 句柄无效(Windows HID C++ API),HidD_* 函数全部失败

删除时出现 C++ 内存错误 - 调试断言失败