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

问题描述 投票:7回答:9

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

数组的维度在编译时是未知的

c++ c
9个回答
9
投票

指向数组开头和维度的指针 - 然后在函数中执行数组运算是最常见的解决方案。

或者使用boost


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(有人说它们无论如何都是坏的)


1
投票

使用矢量矢量,您可以传递矢量。


1
投票

您可以传递指针和大小,或使用std::vector。但“真正的”解决方案是使用模板:

template <size_t N, size_t M>
void foo(int (&pArray)[N][M]);

此函数模板通过引用接受N乘M的int数组。请注意,这是一个函数模板,而不是函数,因此每个数组类型都会获得不同的实例化函数。


1
投票

我认为这是一个GCC扩展(或一个非常现代的C功能),但它可以非常方便:

void foo(int bar[n][m], int n, int m) {...}

1
投票

您可以将指针传递到多维数组的初始内存位置。你还应该传递数组的大小,即每个维度的限制。

int var [x][y][z];
func (var, x, y, z);

功能定义:

void func (int*, int, int, int);

0
投票

我只是总结了其他帖子的选项。

如果维数(N维数组中的N)未知,唯一的方法是使用C ++多维数组类。 Boost或其他库有几种公开可用的实现。见Martin Beckett's帖子。

如果已知维数但数组大小是动态的,请参阅Tom's答案以访问数组元素(将多索引转换为元素指针)。数组本身必须使用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

0
投票

本页第3.4节解决了您的问题:

http://www.programmersheaven.com/2/Pointers-and-Arrays-page-2

当然,在C99之前C中不存在可变长度数组,据我所知它们在C ++中不存在。此外,MSVC不实现/支持C99。


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数组可能会阻止编译器优化,这反过来可能导致执行缓慢。

© www.soinside.com 2019 - 2024. All rights reserved.