指针形参和数组形参有什么区别?
Is there a difference between a pointer parameter and an array parameter?
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
的函数指针"。
相关文章:
- 使用mem_fun_ref if成员函数需要多个形参
- 通过类的模板形参特化成员模板结构
- 非类型引用形参/实参
- 哪个模板形参在boost::shared_ptr构造函数中使用一个原始指针
- 如何确保迭代器模板形参与模板类的模板形参具有相同的数据类型
- 如何在编译时通过模板形参默认值的名称/指针获取函数的类型
- c++:候选模板被忽略:模板形参显式指定的参数无效
- c++中作为形参的指针
- 哪种方法更适合为函数提供编译时间常数?函数实参与模板形参
- 包含void*结构的函数的Const正确性和形参
- 传递boost::函数,该函数接受一个模板实参作为默认为NULL的形参
- 将右值引用形参强制转换为右值引用
- 给引用形参赋值使对象无效
- 当实参是初始化列表而形参是引用时,重载解析
- const整型模板形参的条件
- 使用作为模板形参提供的基类成员,不带限定符
- 模板类的不同返回类型取决于类的形参
- 模板形参有二义性:无法推断模板实参
- 我想知道函数接受const形参和非const形参的区别
- 指针形参和数组形参有什么区别?