Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将多维静态数组传递给函数_C_Arrays_Multidimensional Array - Fatal编程技术网

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

C 将多维静态数组传递给函数,c,arrays,multidimensional-array,C,Arrays,Multidimensional Array,我需要一点建议。所有这三种传递静态多维数组的方式都是三维的吗,我想对于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++) {

我需要一点建议。所有这三种传递静态多维数组的方式都是三维的吗,我想对于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似乎有问题,但无法真正理解它的含义:应为“int***”,但参数的类型为“int*[3][2]”。这是否意味着在这种情况下只有fun2和fun3有效?

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

这些类型不兼容,它们的内存布局也不相同。数组在内存中是连续的,而指向指针的指针不是连续的

如果希望以动态方式使用第一个函数,并且在运行时已知维度,请使用其他参数声明该函数:

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

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

这些类型不兼容,它们的内存布局也不相同。数组在内存中是连续的,而指向指针的指针不是连续的

如果希望以动态方式使用第一个函数,并且在运行时已知维度,请使用其他参数声明该函数:

void fun1( int n, int m, int p , int a[n][m][p] )...
这是因为int***指向指向指针的指针。int*[a][b]指向int[a][b]的指针

数组在内存中是平铺的,这意味着类似int[5][5]的东西使用了与int[25]相同的空间量。使int[5][5]与int**兼容意味着需要在某个地方分配行指针。

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


数组在内存中是平铺的,这意味着类似int[5][5]的东西使用了与int[25]相同的空间量。使int[5][5]与int**兼容意味着需要在某个位置分配行指针。

3D数组表达式不会退化为三重指针;它衰减为指向二维数组的指针。给定代码

int arr[X][Y][Z];
fun1( arr );
fun1调用中的表达式arr将衰减为指向int的Z元素数组的Y元素数组的指针类型,因此fun1的原型需要

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

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

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 );
  ...
}

请注意,必须先声明x、y和z,然后才能在数组参数声明中使用它们

3D数组表达式不会衰减为三个指针;它衰减为指向二维数组的指针。给定代码

int arr[X][Y][Z];
fun1( arr );
fun1调用中的表达式arr将衰减为指向int的Z元素数组的Y元素数组的指针类型,因此fun1的原型需要

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

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

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 );
  ...
}

请注意,必须先声明x、y和z,然后才能在数组参数声明中使用它们

可以使用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;
}

可以使用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;
}

@请让我知道你认为什么是错误的。我不是失败的选民,而且,我认为你的答案没有错。它解决了这个问题+1.@Downvoter请让我知道你认为错了什么。我不是Downvoter,而且,我认为你的答案没有错。它解决了这个问题+1.注意,在第二种情况下,需要使用int*tab或int*&tab调用函数,因为数组元素在内存中是连续的。注意,在第二种情况下,需要使用int*tab或int*&tab调用函数,因为数组元素在内存中是连续的。