对数组参数感到困惑

时间:2014-10-23 14:38:44

标签: c++

这是 C ++ Primer 5th edition 的练习,其中包括:

  

练习6.24:解释以下功能的行为。如果代码中存在问题,请说明它们是什么以及如何解决它们。

void print(const int ia[10])
{
    for (size_t i = 0; i != 10; ++i)
        cout << ia[i] << endl;
}

我在代码中找不到任何问题。这个练习有什么意义?

1 个答案:

答案 0 :(得分:9)

一般问题是在C ++声明语法中,函数参数声明中的数组类型意味着非直观的:声明为T[]T[10]T[1279]的参数实际上是声明为T* - 所有这些参数声明都相同。*

请记住,C ++中没有数组类型的prvalues,因此数组类型不能是函数参数或返回类型。 (当用作prvalue时,数组衰减到指向其第一个元素的指针。)

因此,您的函数声明实际上是(使用T = const int):

void print(const int *);

此参数类型适用于数组到指针的衰减,但现在很清楚,您可以将任何指针传递给int到此函数,以及正确性函数执行不能仅从函数定义中确定。

*)它有点more complicated in C99.


在旁注中,数组 glvalues 完全正常,下面的函数有一个参数类型为&#34;引用数组&#34;:

void print10(const int (&a)[10])
{
    for (auto i : a) { std::cout << i << "\n"; }
}