我怎样在C/C++中传递一个多维数组给函数?
数组的维度在编译时不确定。
传递数组很容易,难点在于在您的函数内部访问数组。正如其他答案中指出的那样,您可以将函数参数声明为指针,并传递每个数组维度的元素数量。
#define xsize 20
#define ysize 30
int array[xsize][ysize];
void fun(int* arr, int x, int y)
{
// to access element 5,20
int x = arr[y*5+20];
}
fun(array, xsize, ysize);
你可以传递指针和大小,或者使用std::vector
。但是“真正”的解决方案是使用模板:
template <size_t N, size_t M>
void foo(int (&pArray)[N][M]);
这个函数模板接受一个 N 行 M 列的整数数组,通过引用传递。请注意,这是一个函数模板,而不是一个函数,因此您会得到每种数组类型的不同实例化函数。
我认为这是GCC的扩展(或者是相当现代的C特性),但它可以非常方便:
void foo(int bar[n][m], int n, int m) {...}
你可以传递指向多维数组初始内存位置的指针。你还应该传递数组的大小,即每个维度的限制。
i.e
int var [x][y][z];
func (var, x, y, z);
函数定义:
void func (int*, int, int, int);
#include <stdio.h>
void print_array(int *arr,int row,int col)
{
int i,j;
for(i=0;i<row;i++){
for(j=0;j<col;j++){
printf("%d ",*(arr+i*col+j));
}
printf("\n");
}
}
int main()
{
int a[2][3] = {{1,0,2},{-1,3,1}};
int b[4] = {1,2,3,34};
print_array(a,2,3);
return 0;
}
这种技术是可行的,但是将数组展平可能会阻止编译器进行优化,从而导致执行速度变慢。
我只是在总结其他帖子中的选项。
如果维度数量(N维数组中的N)未知,则唯一的方法是使用C++多维数组类。有几种公开可用的实现,来自Boost或其他库。请参见Martin Beckett's 的帖子。
如果维数已知但数组大小是动态的,请参见Tom's 的答案以访问数组元素(将多个索引转换为元素指针)。数组本身必须使用malloc或new进行分配。
如果您要编写多维数组类,则需要了解行主序,{column-major-order}等知识。
换句话说,如果数组的维数为(Size1, Size2, Size3, ..., SizeN)
,则:
(Size1 * Size2 * Size3 * ... * SizeN)
sizeof(value_type) * numOfElements
(index1, index2, index3, ..., indexN)
,请使用
ptr[ index1 + (Size1 * index2) + (Size1 * Size2 * index3) + ... ]
,假设第一个数组索引是最快移动的维度这个页面的第3.4节回答了你的问题:
http://www.programmersheaven.com/2/Pointers-and-Arrays-page-2
当然,直到 C99,可变长度数组才出现在 C 中,据我所知它们在 C ++ 中也不存在。此外,MSVC 不实现/支持 C99。