如何将多维数组传递给C / C ++中的函数?
在编译时不知道数组的维数
答案 0 :(得分:9)
指向数组起点和维度的指针 - 然后在函数中进行数组运算是最常见的解决方案。
或使用boost
答案 1 :(得分:3)
传递数组很简单,困难的部分是访问函数内的数组。正如其他一些答案所述,您可以将函数的参数声明为指针,并传递数组每个dim的元素数。
#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);
当然,我遗漏了分配数组的整个业务(因为不知道它的大小是什么,你不能真正使用#defines(有人说它们无论如何都是坏的)< / p>
答案 2 :(得分:1)
使用矢量矢量,可以传递矢量。
答案 3 :(得分:1)
您可以传递指针和尺寸,或使用std::vector
。但“真正的”解决方案是使用模板:
template <size_t N, size_t M>
void foo(int (&pArray)[N][M]);
此函数模板通过引用接受N×M的int数组。请注意,这是一个函数模板,而不是函数,因此每个数组类型都会获得不同的实例化函数。
答案 4 :(得分:1)
我认为这是一个GCC扩展(或一个相当现代的C功能),但它可以非常方便:
void foo(int bar[n][m], int n, int m) {...}
答案 5 :(得分:1)
您可以将指针传递到多维数组的初始内存位置。你还应该传递数组的大小,即每个维度的限制。
即
int var [x][y][z];
func (var, x, y, z);
功能定义:
void func (int*, int, int, int);
答案 6 :(得分:0)
我只是总结其他帖子中的选项。
如果维度(N维数组中的N)未知,唯一的方法是使用C ++多维数组类。 Boost或其他库有几种公开可用的实现。请参阅Martin Beckett's帖子。
如果已知维数但数组大小是动态的,请参阅Tom's answer以访问数组元素(将多索引转换为元素指针)。数组本身必须使用malloc或new分配。
如果您自己编写多维数组类,则需要了解Row-major-order,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) + ... ]
假设第一个数组索引是fastest-moving dimension 答案 7 :(得分:0)
本页第3.4节解决了您的问题:
http://www.programmersheaven.com/2/Pointers-and-Arrays-page-2
当然,在C99之前C中不存在可变长度数组,据我所知它们在C ++中不存在。此外,MSVC不实现/支持C99。
答案 8 :(得分:0)
一种简单的方法是展平数组并使用维度进行迭代。
#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;
}
此技术有效,但flattening数组可能会阻止编译器优化,从而可能导致执行速度变慢。