对数组参数感到困惑 这是C++入门第五版的练习,内容如下:
练习6.24:解释以下函数的行为。如果代码中存在问题,请解释它们是什么以及如何修复它们对数组参数感到困惑 这是C++入门第五版的练习,内容如下:,c++,C++,练习6.24:解释以下函数的行为。如果代码中存在问题,请解释它们是什么以及如何修复它们 void打印(const int ia[10]) { 对于(尺寸i=0;i!=10;++i) 一般的问题是,在C++声明语法中,函数参数声明中的数组类型表示非直观的东西:声明为“代码> t[] ]/CODE或作为 T[ 10 ] < /代码>或作为 T(1279)< /COD>的参数实际上被声明为 T*< /代码> -所有这些参数声明都是相同的。* 记住C++中没有数组类型的PROVE值,因此数组类型不能是函
void打印(const int ia[10])
{
对于(尺寸i=0;i!=10;++i)
一般的问题是,在C++声明语法中,函数参数声明中的数组类型表示非直观的东西:声明为“代码> t[] ]/CODE或作为<代码> T[ 10 ] < /代码>或作为<代码> T(1279)< /COD>的参数实际上被声明为<代码> T*< /代码> -所有这些参数声明都是相同的。*
记住C++中没有数组类型的PROVE值,因此数组类型不能是函数参数或返回类型。(当用作PROVE值时,数组会衰减到其第一个元素的指针)。
因此,函数声明实际上是(使用
T=const int
):
此参数类型与数组到指针的衰减很好地配合,但现在很清楚,您可以将指向int
的任何指针传递给此函数,并且函数执行的正确性不能仅从函数定义来确定
*)有点
另一方面,数组glvalues非常好,下面的函数也很好,它有一个类型为“reference to array”的参数:
void print10(常量int(&a)[10])
{
用于(自动i:a){std::cout这不是一个非常有用的函数。它只能打印一个正好包含10个元素的数组。如果您提供的数组少于10个元素,它就会崩溃。@NeilKirk:如果您提供的数组包含10个元素,那会怎么样?我已经知道神奇的数字了。还有什么吗?参数只是一个指针,相当于const int*
。您需要吗可以将指针传递给较小的数组、单个对象或空指针。如果执行任何操作,函数都会出错。据我所知,如果使用ia
调用的元素超过10个,则只会打印前10个。@pezy我和您有同一本书,因此我知道glvalues还没有讨论过。将给您一个如果你以前没有在其他地方遇到过这些问题,那么他们是什么概念。这是很久以前就应该被禁止的一个特性。“C++中没有数组类型的值,所以数组类型不能是函数参数或返回类型。”谢谢提醒!!虽然答案完全正确,但我不确定向阅读初级读物的人解释prvalues和glvalues会有多大帮助。特别是初级读物是在C++11之前编写的,这些术语是在C++11中引入的。@BenVoigt,James:嗯,是的,我同意这不完全是“初学者水平”,但我想不出一种更简单、更正确的方法。我认为正确的答案从长远来看是有价值的,因为有更多的人来看,尽管它可能不是最容易获得的答案。我不想说“参考文献就是价值观”,因为那不是真的。“参考文献”这个词可以属于变量或类型,但不能属于值。我不希望任何人在以后忘记他们之前学到的东西。
void print(const int ia[10])
{
for (size_t i = 0; i != 10; ++i)
cout << ia[i] << endl;
}
void print(const int *);
void print10(const int (&a)[10])
{
for (auto i : a) { std::cout << i << "\n"; }
}