Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对数组参数感到困惑 这是C++入门第五版的练习,内容如下:_C++ - Fatal编程技术网

对数组参数感到困惑 这是C++入门第五版的练习,内容如下:

对数组参数感到困惑 这是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值,因此数组类型不能是函

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

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"; }
}