26

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

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

它指的是这样的情况:

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

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

从这本 Prentice Hall 的书中: 有问题的书

4

3 回答 3

19

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

通过值意味着对函数中变量的更改不会影响调用函数中的原始值。

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

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

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

不过只是我的看法。

于 2013-04-03T23:28:21.250 回答
17

你是对的。该措辞非常令人困惑,并且使用的“引用”含义与与同名C++ 功能相关的术语引用不同。相反,它谈论的是数组名称衰减为指针的方式——事实上,你根本不会像这样“传递一个数组”!

在“过去”中,“引用”在更一般意义上的使用方式与“句柄”相同——一个抽象术语,表示在不支持它的语言中使用间接来伪造引用语义。但是,C++确实支持它称为引用的东西;因此,在谈论 C++ 时,我们倾向于不使用“句柄”意义上的“引用”(显然,这里是Deitel ∉ "we")。

推荐阅读:

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

于 2013-01-14T04:51:57.943 回答
8

总结我的评论,你是绝对正确的!

本书在行话的选择上是错误的。它试图谈论衰减为 C 指针的数组。它指的是按值传递这个指针作为按引用传递,这是错误的。

这是一个很常见的误解,我相信我也是这样被教导的(将指针作为值传递 == 通过引用传递)。这在 C++ 引用和按引用传递方面是完全错误的。

如果这是正确的,我将无法做到这一点..

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

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

ModifyMyArray(MyArray);

类似于 Java 中的这个问题 - Java是“按引用传递”还是“按值传递”?

于 2013-01-14T03:34:39.373 回答