将数组传递给函数时,以下代码有什么区别?编写代码时应该使用哪个?
PS:我想知道在函数参数中使用 int *ptr 与 int ptr[] 的区别。
void foo(int *ptr)
{
...
...
}
void main()
{
int a[]={10,20,30};
foo(a);
}
与
void foo(int ptr[])
{
...
...
}
void main()
{
int a[]={10,20,30};
foo(a);
}
它们完全相同。
如果函数的参数声明为具有数组类型,则该参数将调整为指针类型。
这在 C 标准关于函数声明符的第 6.7.6.3p7 节中详细说明:
将参数声明为"类型数组"应调整为 "限定指向类型的指针",其中类型限定符(如果有)是 在数组类型派生的
[
和]
中指定的那些。如果 关键字 static 也出现在数组类型的[
和]
中 派生,然后对于每次调用函数,值 相应的实际参数应提供对第一个 元素,其中元素的元素至少与 大小表达式。
这部分是由于在大多数情况下,数组衰减到指向其第一个元素的指针,因此甚至不可能将数组传递给函数(尽管您可以将指针传递给数组)。
从可读性的角度来看,当您希望接收指向数组的第一个元素的指针时,您可能希望使用数组语法,而当您希望接收指向单个对象的指针时,您可能希望使用指针语法。
例如:
void foo1(int *p)
{
*p += 2;
}
void foo2(int p[], int len)
{
int i;
for (i=0; i<len; i++) {
printf("%dn", p[i]);
}
}
在这两种情况下,都可以使用任一语法,但特定的语法使函数的操作更加明显。
数组到指针的转换
在函数参数列表中使用数组类型时,它会转换为相应的指针类型:
int f(int a[2])
和int f(int* a)
声明相同的函数。由于函数的实际参数类型是指针类型,因此带有数组参数的函数调用执行数组到指针的转换;