#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++ 中不起作用?需要做出什么改变?
原文由 Moeb 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果你真的需要你的代码在 C 中运行,你要么需要:
但是,如果使用 C++,使用向量的向量确实是最好的选择!因此,我在这里的新答案:
如何 仅 通过
std::vector<std::vector<int>>&
将多维数组传递给 C++ 中的函数如果使用 C++,请使用
std::vector<>
的std::vector<>
s!:_注意:在我的 eRCaGuy_hello_world 存储 库中查看并运行下面使用的完整演示代码: array_2d_via_std_vector.cpp 。_
示例 1:通过引用传递它:
std::vector<std::vector<int>>&
:您也可以
typedef
类型或使用using
声明使类型更易于管理:然后将其传递为
array2d_t&
或grid_t&
或其他。这是另一个例子:生成数组
可以在构建时生成数组:
使用向量的向量 (
std::vector<std::vector<int>>
) 还具有允许您拥有非均匀多维数组的好处。例如:一个有 3 行,第一行和最后一行 3 列,但中间行 4 列的数组:您还可以在构造时预先设置数组的大小以具有一定数量的行和列,这样您就可以在构造 后 通过
[][]
运算符填充它,如下所示:这是上面代码中最后一个打印输出的样子:
请记住:如果您在数组外部进行索引,使用大括号运算符(
[]
;又名:operator[]
)不会自动为新成员分配新空间。相反,这是 _未定义的行为_,将导致分段错误!请参见此处: https ://en.cppreference.com/w/cpp/container/vector/operator_at(已添加重点):使用
.resize()
更改大小,或使用.push_back()
在向数组添加新元素时自动增长数组。参考