以另一种方式传递多维数组?

时间:2014-02-25 16:42:57

标签: c arrays multidimensional-array

#include <stdio.h>

void arraypass(int from, int to, int a[][2]);

int main()
{
    setbuf(stdout, NULL);
    int t1 = 0, t2 = 0;
    int testArray[10][2];

    for (t1 = 0; t1 < 10; t1++)
    {
        testArray[t1][t2] = t1 + 1;
    }

    t2++;

    for (t1 = 0; t1 < 10; t1++)
    {
        testArray[t1][t2] = t1 + 10;
    }

    arraypass(1,5,testArray);

    return 0;
}

void arraypass(int from, int to, int a[][2])
{
    int b;
    for (b = from; b <= to; b++)
    {
        printf("%d ",a[b][0]);
        printf("%d\n",a[b][1]);
    }
}

为什么会这样?

int a[][2]

有效,但不是

int a[][] 

中的参数定义?

void arraypass(int from, int to, int a[][2]);

并且,有没有办法可以一次传递整个多维数组,还是需要执行某种循环?

3 个答案:

答案 0 :(得分:0)

你必须记住数组衰减到指针。这意味着,当它们(例如)作为参数传递给函数时,函数会收到一个指针。

int a[][2]的作用与int (*a)[2]相同,这意味着a是指向两个int数组的指针。这与指向任何其他维度的数组的指针不同,这就是为什么您不必指定主“维度”(因为编译器与指针相同),但您必须指定其他维度“尺寸(一个或多个)”。

答案 1 :(得分:0)

这与C FAQ中的this answer有关。

因为函数在将数组传递给函数时接收指针,编译器需要知道指针所在的数组的维数(在本例中为2),但不关心如何很长的指向两元素数组的指针序列。

答案 2 :(得分:0)

对于编译器,向量是指向其第一个项目的隐藏指针。 例如:

int a[2];
a[0]=0;
a[1]=1;

是相同的:

int a[2];
*(a+0)=0;
*(a+1)=1;

当你传递一个多维数组(一个简单的数组)时,你应该使用指针而不是一个向量:

void arraypass(int from, int to, int **a);

然后如果你想使用它,你可以这样做:

void arraypass(int from, int to, int **a){
int i,j;
for(i=from; i<end; i++) {
for(j=0; j<2; j++) {
printf("%d",a[i][j]);
}
}