【问题标题】:Confused about array parameters对数组参数感到困惑
【发布时间】:2014-10-23 14:38:44
【问题描述】:

这是C++ Primer 5th edition中的一个练习,内容如下:

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

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

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

【问题讨论】:

  • 这不是一个非常有用的功能。它只能打印恰好包含 10 个元素的数组。如果您提供的数组少于 10 个元素,它将中断。
  • @NeilKirk:如果你提供一个超过 10 个元素的数组呢?
  • 我已经知道神奇的数字了。还有什么?
  • 参数只是一个指针,相当于const int*。您可以将指针传递给较小的数组、单个对象或空指针。如果您执行任何这些操作,该功能将出错。
  • 据我了解,如果使用 ia 调用具有超过 10 个元素,则只会打印前 10 个。

标签: c++


【解决方案1】:

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

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

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

void print(const int *);

这种参数类型与数组到指针的衰减配合得很好,但现在很清楚你可以将 any 指向int 的指针传递给这个函数,以及函数执行的正确性不能仅从函数定义中确定。

*) 有点more complicated in C99.


附带说明,数组 glvalues 非常好,以下函数的参数类型为“对数组的引用”:

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

【讨论】:

  • @pezy 我和你有同一本书,所以我知道 glvalues 还没有被讨论过。 This answer 会让你知道它们是什么,如果你以前没有在其他地方遇到过的话。
  • 这是一个早就应该弃用的功能。
  • "C++ 中没有数组类型的右值,因此数组类型不能是函数参数或返回类型。"谢谢你的提醒!!
  • 虽然答案是完全正确的,但我不确定向阅读入门书的人解释纯右值和泛左值会有多大帮助。尤其是入门书是在 C++11 之前编写的,而这些术语是在 C++11 中引入的。
  • @BenVoigt, James:嗯,是的,我同意这并不完全是“初级水平”,但我想不出一种更简单、更正确的方法。我认为正确的答案从长远来看是有价值的,因为有更多的人来阅读它,尽管它可能不是最容易获得的答案。我不想说“引用是glvalues”,因为那不是真的。 “引用”一词可以与变量或类型有关,但从不与值有关。我不想让任何人在以后忘记他们之前学到的东西。
猜你喜欢
  • 2015-09-05
  • 1970-01-01
  • 1970-01-01
  • 2020-12-06
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 2016-02-13
  • 1970-01-01
相关资源
最近更新 更多