#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/