在C中传递多维数组作为函数参数

在C中,我可以将多维数组作为单个参数传递给一个函数,但我不知道数组的维数是多少?

此外,我的多维数组可能包含字符串以外的其他类型。

0

4 答案

你可以用任何数据类型来做到这一点。简单地说它是一个指针指针:

typedef struct {
  int myint;
  char* mystring;
} data;

data** array;

但是不要忘记你仍然需要malloc变量,它确实有点复杂:

//initialize
int x,y,w,h;
w = 10; //width of array
h = 20; //height of array

//malloc the 'y' dimension
array = malloc(sizeof(data*) * h);

//iterate over 'y' dimension
for(y=0;y

解除分配结构的代码看起来很相似 - 不要忘记在mableced的所有东西上调用free()。 (另外,在强大的应用程序中,您应该检查malloc()的返回情况)。

现在让我们假设你想把它传递给一个函数。您仍然可以使用双指针,因为您可能想要对数据结构进行操作,而不是指向数据结构指针的指针:

int whatsMyInt(data** arrayPtr, int x, int y){
  return arrayPtr[y][x].myint;
}

用以下方法调用此函数

printf("My int is %d.\n", whatsMyInt(array, 2, 4));

输出:

My int is 6.
0
额外
指针分段查找表的指针不是二维数组。仅仅因为它允许 [] [] 语法,它并不奇迹般地变成一个数组。你不能memcpy()等,因为内存不分配在相邻的内存单元中,这是数组所需要的。你的查询表格遍布整个堆,查找速度慢,堆碎片化。
额外 作者 Lundin,
额外 作者 Dchris,

将具有数组维度的第一个元素的显式指针传递为单独的参数。例如,要处理int的任意大小的二维数组:

void func_2d(int *p, size_t M, size_t N)
{
  size_t i, j;
  ...
  p[i*N+j] = ...;
}

这将被称为

...
int arr1[10][20];
int arr2[5][80];
...
func_2d(&arr1[0][0], 10, 20);
func_2d(&arr2[0][0], 5, 80);

同样的原则适用于更高维数组:

func_3d(int *p, size_t X, size_t Y, size_t Z)
{
  size_t i, j, k;
  ...
  p[i*Y*Z+j*Z+k] = ...;
  ...
}
...
arr2[10][20][30];
...
func_3d(&arr[0][0][0], 10, 20, 30);
0
额外
我和j的价值是什么?
额外 作者 Akshay Immanuel D,
取而代之,p [i * Y + j * Z + k] 应该是 p [i * Y * Z + j * Z + k]
额外 作者 David H,

你可以声明你的函数为:

f(int size, int data[][size]) {...}

编译器然后会为你做所有的指针运算。

请注意,尺寸尺寸必须在数组本身之前出现

GNU C允许参数声明转发(如果您确实需要在数组之后传递维度):

f(int size; int data[][size], int size) {...}

第一个维度虽然可以作为参数传递,但对于C编译器来说是无用的(即使对于sizeof运算符,当应用于数组传递时,因为参数始终将视为指向第一个元素的指针)。

0
额外
海事组织这应该是被接受的答案。没有额外的代码需要和没有不必要的堆分配。简单而干净
额外 作者 imkendal,
我按照你所说的声明函数,我从main()调用它并且没问题,但是如果我不知道size(s),我应该如何在main()中声明变量 data ?我用 int * data 尝试过,但不起作用。
额外 作者 Glk-78,
感谢@kjh,我也认为这是最干净的解决方案。接受的答案是为他工作的答案。看看:OP是从2008年开始的,距离我的答案差不多6年。除此之外,我不知道是否允许使用我在此使用的语法的C标准。
额外 作者 rslemos,
这是我最终采用的将大小为M×N的整数矩阵(二维数组)作为函数参数传递的解决方案。也许更多的信息会有帮助:函数原型如下:void f(int N,int data [] [N],int M);在函数体中,element [m] [n]可以写成data [m] [n] - 非常方便,不需要进行索引计算。
额外 作者 jonathanzh,
int matmax(int **p, int dim) // p- matrix , dim- dimension of the matrix 
{
    return p[0][0];  
}

int main()
{
   int *u[5]; // will be a 5x5 matrix

   for(int i = 0; i < 5; i++)
       u[i] = new int[5];

   u[0][0] = 1; // initialize u[0][0] - not mandatory

   // put data in u[][]

   printf("%d", matmax(u, 0)); //call to function
   getche(); // just to see the result
}
0
额外
这不是一个二维数组,它是一个查找表。此外,这是被标记为C.
额外 作者 Lundin,