【发布时间】:2014-04-21 16:20:34
【问题描述】:
void method(double *v)
void method(double v[5])
这两者有什么区别吗?
第二个是否更具体,例如 v 的长度被限制为 5 个元素?
【问题讨论】:
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 函数第 3 节
[ ... ] 确定每个参数的类型后,将“
T的数组”或“函数返回T”类型的任何参数调整为“指向T的指针”或“指向T的指针”函数分别返回T,”。
【讨论】: