c语言 - 将数组传递给函数.参数 int *ptr 与 int ptr[ ] 有什么区别



将数组传递给函数时,以下代码有什么区别?编写代码时应该使用哪个?

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)声明相同的函数。

由于函数的实际参数类型是指针类型,因此带有数组参数的函数调用执行数组到指针的转换;

相关内容

  • 没有找到相关文章

最新更新