我正在读一本C++书,上面写着:
C++通过引用将数组传递给函数 - 被调用的函数可以修改调用者原始数组中的元素值.
它指的是这样的情况:
int hourlyTemperatures[ 24 ];
modifyArray( hourlyTemperatures, 24 );
Run Code Online (Sandbox Code Playgroud)
但是,这是香草C阵列指针在这里工作,对吧?没有使用C++"引用"技术,传递的是按值的指针,在这种情况下,是指向数组的第一个元素的指针.最终的结果是函数确实可以访问完整的原始数组,就像引用一样,但实际上并没有通过引用传递,对吧?
从这本Prentice Hall书中:

Lig*_*ica 14
你是对的.措辞非常混乱,使用的"引用"含义与有关同名C++功能的术语引用不同.相反,它正在讨论数组名称衰减为指针的方式 - 实际上你根本就没有像这样"传递数组"!
在"过去的日子"中,"引用"在更广泛的意义上以与"句柄"相同的方式使用 - 一个抽象术语,表示在不支持它的语言中使用间接来伪造引用语义.但是,C++ 确实支持它调用引用的东西; 因此,在谈论C++(Deitel∉"我们",显然)时,我们倾向于不在其"句柄"意义上使用"引用" .
推荐阅读:
任何其他C++书籍都非常谨慎!虽然在生活的大部分领域,我认为在上述两个特定列表中包含一本书被认为是"好"的明确先决条件是疯狂的,但是有足够多的危险错误的C++文本在那里(例如你引用的文本)这对于我们的语言新手来说是一个足够大的问题,在C++书籍的世界里,它实际上是一个很好的经验法则.
bcf*_*man 14
确实,当您将数组传递给函数时,您实际上是按值传递指针.但是,我觉得对于刚刚学习C++的人来说,他们根本不必担心指针.他们了解到您可以按值或通过引用函数传递变量.
按值表示对函数中变量的更改不会影响调用函数中的原始值.
通过引用意味着如果函数更改了变量的值,那么这些更改将在原始调用函数中看到.
当数组是函数的参数(没有const关键字)时,将在原始调用函数中看到对数组中的值所做的任何更改.因此,我们说默认情况下数组是通过引用传递的.这避免了必须解释哪些指针在传递静态声明的数组时确实不相关,但是它让人们知道如果它们混淆了被调用函数中数组中的值,那么这些更改将在调用函数中持续存在.
我在一流的工程学院教授"第一门课程"计算机科学C++课程(我们的编程团队将参加今年在俄罗斯举行的世界总决赛).班上大约90%的人实际上并不是与计算机相关的专业(大多数是机械工程师).上面的材料绰绰有余,无需解释指针是什么.这就是为什么那本书和其他人提到数组是通过引用传递的原因,因为许多读书的人只需要"足够的"C++来获取它们而不必学习每一个细节.那些真正想要编程的人应该没有问题转换到数组真正通过指针传递的事实.
只是我的意见.
总结一下我的评论,你是绝对正确的!
这本书选用行话是错误的.它试图讨论衰减到C指针的数组.它指的是通过引用传递此指针作为错误的引用.
这是一个常见的误解,我相信我也是这样教的(将指针传递给值==通过引用传递).就C++引用而言,这是完全错误的,并且通过引用传递.
如果这是正确的,我将无法做到这一点 ..
void ModifyMyArray(int *array){
int oops[4]= {0};
array = oops;
array[2] = 1;
}
...
int MyArray[4] = {1,3,5,7};
ModifyMyArray(MyArray);
Run Code Online (Sandbox Code Playgroud)
类似于Java中的这个问题 - Java 是"传递引用"还是"传递价值"?