经过测试,显而易见,以下代码无法正常工作,因为我们使用数组a的第一个元素的地址初始化数组q [] [4]。
int main()
{
int a[3][4] =
{
1, 2, 3, 4,
5, 6, 7, 8,
9, 0, 1, 6
} ;
int q[ ][4]=a;
int i,j;
for(i=0; i<3; i++)
{
for(j=0;j<4;j++)
{
printf("%d",q[i][j]);
}
}
return 0;
}
但是,如果我们使用函数实现相同的逻辑(即将数组a的地址传递给函数的形式参数q [] [4]),那么它可以正常工作。
main( )
{
int a[3][4] =
{
1, 2, 3, 4,
5, 6, 7, 8,
9, 0, 1, 6
} ;
print ( a, 3, 4 ) ;
}
print ( int q[ ][4], int row, int col )
{
int i, j ;
for ( i = 0 ; i < row ; i++ )
{
for ( j = 0 ; j < col ; j++ )
printf ( "%d ", q[i][j] ) ;
printf ( "\n" ) ;
}
printf ( "\n" ) ;
}
怎么可能?
答案 0 :(得分:1)
int q[ ][4]
等效于int (*q)[4]
(指向int
的4元素数组的指针)。 N1570 6.7.6.3函数声明符(包括原型),第7段说:
参数声明为''数组类型''应调整为''限定指针 type'',其中类型限定符(如果有)是在[和]中指定的类型 数组类型推导。
用于函数参数的a
也转换为指向数组第一个元素的指针,该数组是int
的4元素数组。 N1570 6.3.2.1左值,数组和函数指示符。第3段说:
除非它是sizeof运算符的操作数,_Alignof运算符,或者 一元&amp; operator,或者是用于初始化数组的字符串文字,一个具有的表达式 类型''数组''转换为类型为''指向类型'指针的表达式 到数组对象的初始元素,而不是左值。
因此,函数print()
可以知道数组元素的位置并使用它。
顺便说一句,在使用这些函数的行之前,不要忘记声明函数(或包含声明它们的标题)。