为什么我们可以通过引用将数组传递给函数而不使用指针

时间:2016-08-18 02:32:38

标签: c arrays

经过测试,显而易见,以下代码无法正常工作,因为我们使用数组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" ) ;
    }

怎么可能?

1 个答案:

答案 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()可以知道数组元素的位置并使用它。

顺便说一句,在使用这些函数的行之前,不要忘记声明函数(或包含声明它们的标题)