我需要一些建议。所有这三种传递静态,多维数组的方法(这里我有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]’|
。这是否意味着在这种情况下只有fun2
和fun3
有效?
答案 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 );
...
}
,x
和y
必须先声明,然后才能在数组参数声明中使用它们。
答案 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;
}