在C和C ++中通过引用传递的含义?

我对C和C ++中“通过引用传递”的含义感到困惑。

在C中,没有参考。 所以我猜通过引用传递意味着传递一个指针。 但是为什么不通过指针调用它呢?

在C ++中,我们有指针和引用(和迭代器之类的东西很接近)。 那么通过引用传递的是什么意思呢?

在口语用法中,“按引用传递”意味着,如果被调用者修改其参数,则它会影响调用者,因为被调用者看到的参数的是调用者看到的值。

该短语的使用独立于实际的编程语言,以及它如何调用事物(指针,引用,等等)。

在C ++中,可以使用引用指针来完成call-by-reference 。 在C中,只能通过传递指针来实现call-by-reference

“按价值呼叫”:

void foo( int x ) { // x is a *copy* of whatever argument foo() was called with x = 42; } int main() { int a = 0; foo( a ); // at this point, a == 0 } 

“按参考呼叫”,C风格:

 void foo( int * x ) { // x is still a *copy* of foo()'s argument, but that copy *refers* to // the value as seen by the caller *x = 42; } int main() { int a = 0; foo( &a ); // at this point, a == 42 } 

因此,严格地说, C中没有传递参考 。 您可以传递变量by-value,也可以将指针传递给该变量by-value

在C中,没有参考

没有参考变量 。 但是你可以使用指针来引用对象。 因此,从抽象的角度来看,指针是“引用”。

但是为什么不通过指针调用它呢?

可以 通过指针调用它。 参考是一个比指针更通用的术语。 当您想要讨论抽象并希望忽略实现细节时,通常最好使用更通用的术语。 您可以通过引用调用它,原因与您调用变量“integer”而不是“int32_t”的原因相同。

在C ++中,我们有指针和引用(和迭代器之类的东西很接近)。 那么通过引用传递的是什么意思呢?

取决于背景。 通常它意味着函数参数是引用变量,但它也可以引用指针,迭代器,引用包装器……引用对象的任何东西。


引用是一个超越c和c ++的抽象概念; 甚至超越编程 。 在c ++中,该术语与引用变量不明确,并且上下文和约定(不是通用的)决定了含义。

在C中,没有任何引用变量,但您可以使用指针传递引用。

在维基百科中,有这个定义。 在逐个引用的评估(也称为pass-by-reference)中,函数接收对用作参数的变量的隐式引用,而不是其值的副本。 所以这个术语是托马斯提到的参数传递类型。 所以是的,因为C比C ++旧,所以这个想法也比C ++旧。

但是,在C ++中,指针和引用都可用于传递给函数(按地址调用和按引用调用)。 实际上他们的工作方式相同,只有一些差异。

  • 创建引用后,以后不能引用另一个引用; 它不能重新安置。 这通常用指针完成。
  • 引用不能为NULL。 指针通常为NULL,表示它们没有指向任何有效的东西。
  • 声明时必须初始化引用。 指针没有这样的限制

有了这些差异,如果使用引用调用而不是通过指针调用,则可以减少出现NULL指针错误的可能性。

让我们清楚你的困惑。

在C中,没有参考。 所以我猜通过引用传递意味着传递一个指针。 但是为什么不通过指针调用它呢?

因为传入C的每个参数都是传值 。 甚至指针参数也是副本。 但它包含(或指向,如果您愿意) 相同的值 – 内存地址。 这就是你可以改变它指向的变量的方法,但不是指针本身。 因为它是一个副本,所以无论你做什么都不会影响调用者级别的指针。

在C ++中,我们有指针和引用(和迭代器之类的东西很接近)。 那么通过引用传递的是什么意思呢?

这意味着,参数是调用者级别上的变量的别名,而不是副本,这允许我们更改它。

希望有所帮助。

一般来说,引用是引用其他内容的实例。 因此,在更广泛的意义上,指针也可以被认为是参考的一种可能的实现。 C ++中的引用只是被称为引用,因为除引用它们之外,它们不提供其他function。

通常使用pass-by-reference来区分pass-by-value。 无论是通过指针还是通过引用,通常只是一个小细节。 但是,使用C ++引用时,更清楚的是函数参数的用途是什么。 例如:

 int foo(int& a); // pass-by-reference int foo(const int& a); // is pratically pass-by-value // (+ avoiding the copy of the parameter) 

另一方面,使用引用(与指针相比),如果它是值传递或按引用传递,则在调用站点不是那么明显。 例如

 int x; int y = foo(x); // could be pass-by-value or pass-by-reference int z = foo(&x); // obviously pass-by-reference (as a pointer) 

想象一下,你必须画你的房子……

by value:你把你房子的副本带给画家=>付出很多努力(也许是在轨道上)
by reference:你把你的房子地址给画家,这样他就可以来画画

“ 通过引用传递 ”(或“通过引用调用”)是调用函数时传递的参数类型的术语,并且该想法早于C ++。 它不一定要使用C ++“ 引用 ”来完成。 C没有内置机制来执行此操作,因此您必须使用指针。

只是为了添加答案,引用并不意味着按地址引用。 编译器可以使用任何方法来引用变量。

当您通过引用传递某些内容时,您正在使用地址而不是直接使用变量的值,如果使用引用参数,则获取传入的变量的地址。

从那里你可以随心所欲地操作它,因为你传入的变量会在你改变函数中的引用时改变。 这是一种处理大量数据的简单方法,它实际上只是节省了内存等。

在C中有两个概念

1.按值调用 – 此处传递值的副本,因此实际值不会在函数外部更改。

2.通过引用调用 – 但是这里传递实际值(实际操作数的地址),因此它将全局更改值。

在C ++中有两个概念

1.按值传递 – 它与c相同,实际值不会改变,此值的范围仅为函数。

2.通过引用传递 – 实际值(实际操作数的地址)被传递,因此它将全局更改值,这意味着如果值被更改,那么它将影响整个程序。

在Pass by Reference中,操作数的地址被传递,这就是为什么它被称为Pass By Reference而不是指针。