gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:06:26 25 4
gpt4 key购买 nike

经过测试,很明显,当我们使用数组 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" ) ;
}

怎么可能呢?

最佳答案

函数参数中的

int q[ ][4] 相当于 int (*q)[4] (指向 int 的 4 元素数组的指针)。 N1570 6.7.6.3 函数声明符(包括原型(prototype)),第 7 段说:

A declaration of a parameter as ‘‘array of type’’ shall be adjusted to ‘‘qualified pointer to type’’, where the type qualifiers (if any) are those specified within the [ and ] of the array type derivation.

此外,用于函数参数的 a 会转换为指向数组第一个元素的指针,该数组是 int 的 4 元素数组。 N1570 6.3.2.1 左值、数组和函数指示符。第 3 段说:

Except when it is the operand of the sizeof operator, the _Alignof operator, or the unary & operator, or is a string literal used to initialize an array, an expression that has type ‘‘array of type’’ is converted to an expression with type ‘‘pointer to type’’ that points to the initial element of the array object and is not an lvalue.

因此,函数 print() 可以知道数组元素的位置并对其进行处理。

顺便说一句,不要忘记在使用函数的行之前声明函数(或包括声明函数的 header )。

关于c - 为什么我们可以通过引用将数组传递给函数而不使用指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39009091/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com