如何将动态多维数组传递给函数?

时间:2010-07-01 04:58:23

标签: c++ c

如何将多维数组传递给C / C ++中的函数?

在编译时不知道数组的维数

9 个答案:

答案 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数组可能会阻止编译器优化,从而可能导致执行速度变慢。