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

5

void method(double *v)

void method(double v[5])

这两个有什么区别吗?

第二种更具体吗,比如v被限制为长度为5的元素数组?

2个回答

8

当数组被声明为参数类型时,会转化成指针类型。在你的例子中,

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的双精度数组。如果您传递任何其他大小的数组(或者如果您传递指针),它将导致编译错误!


4
不和不。在函数参数中时,它们是相同的,编译器将参数double v[5]视为指针。大小5被忽略了,最多只是程序员的信号。
引用块:

C++ 11 §8.3.5 Functions Section 3

[ ... ] 确定每个参数的类型后,任何类型为“T数组”或“返回T的函数”的参数都会被调整为“T指针”或“返回T的函数指针”,分别。


1
除了在第二种情况下可以获取数组的长度,我认为?如果您传入double [6]会发生什么?我希望第一种情况可以工作,但第二种情况会生成错误。 - 3Dave
1
@DavidLively 你的意思是在函数内部吗?不行,它是指向编译器的指针。 - Yu Hao
编译器在函数参数列表上的检查中,会将数组[5]视为与数组[10]不同。 - Richard Chambers
很奇怪 - 我本以为这会按值传递,但我的快速测试应用程序表明情况并非如此。 - 3Dave
@DavidLively:请看我的回答,它会进一步解释。 - Nawaz
1
@Nawaz 是的,非常有道理。谢谢。 - 3Dave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接