例如,我想将一个二维整数数组传递给C中的函数。该函数是否应该定义为
void foo(int**,int m,int n);
或
void foo(int[][],int m,int n);
我在第一个原型(prototype)声明中遇到错误,但在使用 GCC 编译时收到警告“不兼容的指针类型”。请解释如何传递二维数组。主要方法如给出
int main()
{
int m,n;
scanf("%d%d",&m,&n);
int a[m][n];
foo(a,m,n);
return 0;
}
最佳答案
两个函数声明
void foo(int**,int m,int n);
和
void foo(int[][],int m,int n);
是错误的。具有数组类型的参数的声明被调整为指向元素类型的指针。因此,如果您有一个具有二维数组类型的参数声明,如下所示
int a[M][N]
然后调整为
int ( *p )[N}
对于函数定义,N 的值必须已知。如果 N
是声明的编译时常量,例如
#define N 10
那么函数声明可以是这样的
void foo( int[][N], int );
或
void foo( int[][N], size_t );
其中第二个参数指定“行”数。 “列”的数量是已知的,因为正如我所说,它是一个编译时常量。
如果 N 在运行时计算并且编译器支持可变长度数组,那么您应该声明如下函数
void foo( int, int, int[*][*] );
或者,最好使用 size_t
类型来代替尺寸的 int
类型。例如
void foo( size_t, size_t, int[*][*] );
请考虑到至少第二个参数必须位于数组的声明之前,因为它用于确定数组的元素类型(其大小应为函数定义所知)。
对于不是其定义的函数声明,不需要参数名称。
这里显示了如何使用可变长度数组表示法来声明和定义函数。
#include <stdio.h>
void foo( size_t, size_t, int[*][*] );
void foo( size_t m, size_t n, int a[m][n] )
{
for ( size_t i = 0; i < m; i++ )
{
for ( size_t j = 0; j < n; j++ ) printf( "%d ", a[i][j] );
putchar( '\n' );
}
}
#define M 2
#define N 3
int main(void)
{
int a[M][N] =
{
{ 1, 2, 3 },
{ 4, 5, 6 }
};
foo( M, N, a );
size_t m = 3;
size_t n = 2;
int b[m][n];
for ( size_t i = 0; i < M; i++ )
{
for ( size_t j = 0; j < N; j++ ) b[j][i] = a[i][j];
}
putchar( '\n' );
foo( m, n, b );
return 0;
}
程序输出为
1 2 3
4 5 6
1 4
2 5
3 6
第三个参数也可以这样声明
void foo( size_t m, size_t n, int a[][n] )
或
void foo( size_t m, size_t n, int ( *a )[n] )
因为正如所指出的,数组被调整为指向其元素类型的指针。
关于c - int[ ][ ] 和 int** 有什么区别(菜鸟),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43028052/