指针形参和数组形参有什么区别?

Is there a difference between a pointer parameter and an array parameter?

本文关键字:形参 区别 什么 数组 指针      更新时间:2023-10-16

void method(double *v)

void method(double v[5])

这两者有什么区别吗?

第二个更具体,如在v被限制为5个元素的长度?

数组声明为参数类型时,衰减为指针类型。在您的示例中,

void method(double v[5]);

这里5没有任何作用,它是如此的微不足道,你可以全部省略,而写成:

void method(double v[]);

与前面的声明完全相同。因为它会衰变成指针,所以上面两个完全相同:

void method(double *v); //because array decays to pointer, anyway

也就是说,下列所有语句都是同一函数的声明:

void method(double v[5]); //ok : declaration 
void method(double v[]);  //ok : redeclaration of the above
void method(double *v);   //ok : redeclaration of the above

都是完全相同的。没有差别。

请注意以下内容是不同的:

void f(double (&v)[5]); 

声明了一个函数,该函数可以接受大小为的双精度数组 5。如果传递任何其他大小的数组(或者传递指针),它将给出编译错误!

不,不。

当函数实参相同时,编译器将实参double v[5]视为指针。大小5被忽略,它最多是给程序员的一个信号。

c++ 11§8.3.5函数第三节

[…]在确定每个参数的类型后,任何类型为"T的数组"或"返回T的函数"的参数将分别调整为"指向T的指针"或"返回T的函数指针"。