将多维静态数组传递给函数

时间:2014-11-12 21:33:07

标签: c arrays multidimensional-array

我需要一些建议。所有这三种传递静态,多维数组的方法(这里我有3维,我猜4维,它都是类比的)对于一个函数是正确的吗?

以下是代码:

#include <stdio.h>    
void fun1(int ***tab, int n, int m, int p)
{
   int i,j,k;
   for(i=0; i<n; i++)
   {
      for(j=0; j<m; j++)
      {
        for(k=0; k<p; k++)
        {
           printf("tab[%d][%d][%d] = %d\n", i, j, k, tab[i][j][k]);
        }
        printf("\n");
      }
      printf("\n");
   }
}

void fun2(int tab[2][3][2])
{
    int i,j,k;
    for(i=0; i<2; i++)
    {
       for(j=0; j<3; j++)
       {
          for(k=0; k<2; k++)
          {
             printf("tab[%d][%d][%d] = %d\n", i, j, k, tab[i][j][k]);
          }
          printf("\n");
       }
       printf("\n");
   }
}

void fun3(int tab[][3][2])
{
    int i,j,k;
    for(i=0; i<2; i++)
    {
       for(j=0; j<3; j++)
       {
          for(k=0; k<2; k++)
          {
            printf("tab[%d][%d][%d] = %d\n", i, j, k, tab[i][j][k]);
          }
          printf("\n");
      }
      printf("\n");
  }
}

int main()
{
    int tab[2][3][2] =
    {
        {{0, 1}, {2, 3}, {3, 4}},
        {{5, 6}, {7, 8}, {9, 10}}
    };

    fun1(tab,2,3,2);
    printf("--------------------------\n");
    fun2(tab);
    printf("--------------------------\n");
    fun3(tab);

    return 0;
}

fun1似乎存在问题,但无法理解其含义:expected ‘int ***’ but argument is of type ‘int (*)[3][2]’|。这是否意味着在这种情况下只有fun2fun3有效?

4 个答案:

答案 0 :(得分:2)

一个是指向指向int int ***的指针的指针,另一个是指向维度为3和2 int (*)[3][2]的数组的指针。

这些类型不兼容,并且它们的内存布局不一样。数组在内存中是连续的,而指针的指针则不是。

如果您希望以动态方式使用第一个函数,其中维度在运行时已知,则使用其他参数声明它:

void fun1( int n, int m, int p , int a[n][m][p] )...

答案 1 :(得分:2)

3D数组表达式不会衰减为三重指针;它衰减到指向2D数组的指针。鉴于代码

int arr[X][Y][Z];
fun1( arr );

arr的调用中的表达式fun1将衰减为“指向int的Z元素数组的Y元素数组的指针”,因此{{1}的原型需要

fun1

请注意,在这种情况下,必须在编译时知道void fun1( int (*table)[Y][Z] ) // or int table[][Y][Z] { // do something with table[i][j][k] } Y

如果您正在使用仍支持可变长度数组的C99编译器或C2011编译器,您可以执行以下操作:

Z

请注意,void fun1( size_t x, size_t y, size_t z, (*table)[y][z] ) // or table[][y][z], or table[x][y][z] { // do something with table[i][j][k] } int main( void ) { int table[2][3][2] = ...; fun1( 2, 3, 2, table ); ... } xy必须先声明,然后才能在数组参数声明中使用它们。

答案 2 :(得分:1)

这是因为int ***指向指针的指针。 int (*)[a][b]指向int[a][b]的指针。

阵列在内存中是平面布局的,这意味着像int[5][5]这样的空间使用与int[25]相同的空间。使int[5][5]int**兼容意味着需要在某处分配行指针。

答案 3 :(得分:0)

可以使用fun1或fun4的实现将多维数组传递给函数。

#include <stdio.h>

void fun1(int n, int m, int p, int tab[n][m][p])
{
int i,j,k;

for(i=0; i<n; i++)
{
    for(j=0; j<m; j++)
    {
        for(k=0; k<p; k++)
        {
            printf("tab[%d][%d][%d] = %d\n", i, j, k, tab[i][j][k]);
        }
        printf("\n");
    }
    printf("\n");
}
}

void fun4(int n, int m, int p, int* tab) {
int i,j,k;
for(i=0; i<n; i++)
{
    for(j=0; j<m; j++)
    {
        for(k=0; k<p; k++)
        {
            printf("tab[%d][%d][%d] = %d\n", i, j, k, tab[i*m*p+j*p+k]);
        }
        printf("\n");
    }
    printf("\n");
}
}

void fun2(int tab[2][3][2])
{
int i,j,k;

for(i=0; i<2; i++)
{
    for(j=0; j<3; j++)
    {
        for(k=0; k<2; k++)
        {
            printf("tab[%d][%d][%d] = %d\n", i, j, k, tab[i][j][k]);
        }
        printf("\n");
    }
    printf("\n");
}
}

void fun3(int tab[][3][2])
{
int i,j,k;

for(i=0; i<2; i++)
{
    for(j=0; j<3; j++)
    {
        for(k=0; k<2; k++)
        {
            printf("tab[%d][%d][%d] = %d\n", i, j, k, tab[i][j][k]);
        }
        printf("\n");
    }
    printf("\n");
}
}

int main()
{
int tab[2][3][2] =
{
    {{0, 1}, {2, 3}, {3, 4}},
    {{5, 6}, {7, 8}, {9, 10}}
};

fun1(2,3,2, tab);
printf("--------------------------\n");
fun4(2,3,2, (int*)tab);
printf("--------------------------\n");
fun2(tab);
printf("--------------------------\n");
fun3(tab);


return 0;
}