如果您的编译器支持可变长度数组,您可以编写以下代码:
void myfunc( int rows, int cols, int a[rows][cols] );
请注意,第三个参数会被隐式转换为类型为int ( * )[cols]
的指针,这意味着在函数内部您正在处理一个一维数组的指针。尽管如此,您仍然可以使用以下表达式:
for ( int i = 0; i < rows; i++ )
{
for ( int j = 0; j < cols; j++ ) a[i][j] = value;
}
否则,如果编译器不支持可变长度数组且所有数组的第二维度相同,则可以像这样声明函数:
void myfunc(int (*a)[2], int rows);
请注意,这个声明
int[][3] *test
无论如何都是不正确的。
如果您想传递多个二维数组,则可以在main函数中声明一个一维数组,例如:
int a[2][2] = {{1,2},{3,4}};
int b[2][2] = {{5,6},{7,8}};
int ( *p[] )[2] = { a, b, };
然后将其传递给一个函数。
在这种情况下,该函数看起来应该像这样:
void myfunc( int ( **p )[2], size_t n );
这里有一个演示程序。
#include <stdio.h>
void myfunc( int ( **p )[2], size_t n )
{
for ( size_t i = 0; i < n; i++ )
{
for ( size_t j = 0; j < 2; j++ )
{
for ( size_t k = 0; k < 2; k++ ) printf( "%d ", p[i][j][k] );
putchar( '\n' );
}
putchar( '\n' );
}
}
int main(void)
{
int a[2][2] = {{1,2},{3,4}};
int b[2][2] = {{5,6},{7,8}};
int ( *p[] )[2] = { a, b };
myfunc( p, sizeof( p ) / sizeof( *p ) );
return 0;
}
它的输出是
1 2
3 4
5 6
7 8
如果数组的第一维不是固定的而是变化的,那么您可以将一个包含数组第一维度的数组也传递给函数。
a
。也许每个a
存在于一个数组中,或者它在堆中。你如何更新myfunc
的签名,以便编译器知道每个a
的维度? - Anti Earth(**p)[2]
表示符号上表示 外部 数组的长度为 2 (a
和b
),而不是表示最内层的维度为2
。因此,我对它的工作原理感到困惑。 - Anti Earth*p[]
周围有 括号!所以int **p[2]
读作“最外层有维度2”,但是int (**p)[2]
读作“最内层有维度2”?这真的很有帮助,非常感谢! - Anti Earth