默认情况下通过引用传递的数组?

时间:2013-01-14 03:23:19

标签: c++ c

我正在阅读一本C ++书,上面写着:

  

C ++通过引用将数组传递给函数 - 被调用的函数可以修改调用者原始数组中的元素值。

指的是这样的情况:

int hourlyTemperatures[ 24 ]; 
modifyArray( hourlyTemperatures, 24 );

然而,这是vanilla C数组指针在这里工作,对吧?没有使用C ++“引用”技术,传递的是指针按值,在这种情况下,是指向数组第一个元素的指针。最终结果是函数确实可以访问完整的原始数组,就像引用一样,但实际上并没有通过引用传递,对吧?

从这本Prentice Hall书中: The book in question

3 个答案:

答案 0 :(得分:14)

你是对的。措辞非常混乱,使用“引用”的含义与与同名C ++功能相关的术语引用不同。相反,它正在谈论数组名称衰减为指针的方式 - 实际上你根本就没有像这样“传递数组”!

在“过去的日子”中,“引用”在更广泛的意义上以与“句柄”相同的方式使用 - 一个抽象术语,表示在不支持它的语言中使用间接来伪造引用语义。但是,C ++ 确实支持它所谓的 references ;因此,在谈论C ++时,我们倾向于不在其“句柄”意义上使用“引用”(其中 Deitel∉“我们”,显然)。

推荐阅读:

任何其他C ++书都非常谨慎 !!虽然在生活的大多数领域,但我认为在上述两个特定列表中包含一本书被认为是“好的”的明确先决条件是疯狂的,有足够多的危险错误的C ++文本在那里(例如你引用的文字)这对于我们的语言新手来说是一个足够大的问题,在C ++书籍的世界里,它实际上是一个很好的经验法则。

答案 1 :(得分:13)

确实,当您将数组传递给函数时,您实际上是按值传递指针。但是,我觉得对于刚刚学习C ++的人来说,他们根本不用担心指针。他们了解到您可以按值或通过引用函数传递变量。

按值表示对函数中变量的更改不会影响调用函数中的原始值。

通过引用意味着如果函数更改了变量的值,那么这些更改将在原始调用函数中看到。

当数组是函数的参数(没有const关键字)时,在原始调用函数中将看到对数组中的值所做的任何更改。因此,我们说默认情况下数组是通过引用传递的。这避免了必须解释哪些指针在传递静态声明的数组时确实不相关,但是它让人们知道如果它们混淆了被调用函数中数组中的值,那么这些更改将在调用函数中持续存在

我在一流的工程学院教授“第一门课程”计算机科学C ++课程(我们的编程团队将参加今年在俄罗斯举行的世界总决赛)。班上大约90%的人实际上并不是与计算机相关的专业(大多数是机械工程师)。上面的材料绰绰有余,无需解释指针是什么。这就是为什么这本书和其他人提到数组是通过引用传递的原因,因为许多读书的人只需要“足够的”C ++来获取它们而不必学习每一个细节。那些真正想要编程的人应该没有问题转换到数组实际上是通过指针传递的事实。

只是我的意见。

答案 2 :(得分:7)

总结一下我的评论,你是对的!

本书错误用于选择行话。它试图谈论arrays decaying to C pointers。它指的是将此指针按值传递为通过引用传递,这是错误的。

这是一个常见的误解,我相信我也是这样教的(将指针传递给值==通过引用传递)。这在C ++引用方面是完全错误的,并且通过引用传递。

如果这是正确的,I wouldn't be able to do this ..

void ModifyMyArray(int *array){
   int oops[4]= {0};
   array = oops;

   array[2] = 1;
}
...
int MyArray[4] = {1,3,5,7};

ModifyMyArray(MyArray);

与Java中的这个问题类似 - Is Java "pass-by-reference" or "pass-by-value"?