对数组参数感到困惑

pez*_*ezy 5 c++

这是C++ Primer第5版的练习,其中包括:

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

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

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

Ker*_* SB 9

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

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

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

void print(const int *);
Run Code Online (Sandbox Code Playgroud)

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

*)在C99中有点复杂.


另外,数组glvalues非常精细,下面的函数有一个参数,其类型是"对数组的引用":

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