在C中,没有引用的概念。因此,我猜 "按引用传递" 意味着传递一个指针。但是,为什么不称之为 "按指针传递" 呢?
在C ++中,我们既有指针又有引用(以及类似迭代器之类的东西)。那么,这里的 "按引用传递" 是什么意思?
在口语中,“按引用传递”意味着,如果被调用者修改了其参数,则会影响到调用者,因为被调用者看到的参数 参考 来自调用者看到的值。
这个短语与实际的编程语言无关,也与如何调用它们(指针、引用等)无关。
在C++中,使用引用 或 指针可以实现按引用传递。在C语言中,只能通过传递指针来实现按引用传递。
“按值传递”:
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 语言中不存在按引用传递。你可以通过按值传递变量,或通过按值传递指向该变量的指针来实现。
va_start
(它旨在获取堆栈上最后一个命名参数的地址,以便您可以从那里访问下一个参数)时,C++引用会指向调用者的堆栈帧中的变量。不用说,这不会按预期工作。(在一些调试“乐趣”之后我发现了这个问题。)指针按预期工作(指针按值传递)。 - DevSolarvoid foo(int bar[]);
可以使用int baz[42]; foo(baz);
调用,并且调用者将看到更改后的数组内容。从技术上讲,函数参数衰减为指针,在函数签名和调用中都是如此,因此在技术上是通过值传递指针,但可见效果是通过引用传递数组。 - cmaster - reinstate monicasizeof
来计算数组的大小...因为它是按值传递的指针。;-) - DevSolara
或k
,但它是相同的对象。 - DevSolar参考是一个抽象的概念,存在于C和C++之外;甚至超越编程。在C++中,该术语与引用变量含义不明确,上下文和惯例(并非普遍适用)决定了其意义。
在C语言中,没有任何引用变量,但是你可以使用指针来传递引用。
在维基百科上,有这样的定义。在按引用调用评估(也称为按引用传递),函数接收对用作参数的变量的隐式引用,而不是其值的副本。因此,这个术语是由Thomas提到的一种参数传递类型。所以是的,由于C比C++更早,这个想法也比C++更早。
然而,在C++中,指针和引用都可以用于传递给函数(按地址调用和按引用调用)。实际上它们的工作方式是相同的,只有一些差异。
通过这些差异,如果你使用按引用调用而不是按指针调用,你可以减少出现空指针错误等问题的可能性。
让我们消除你的困惑。
C语言中没有引用(reference)。因此,我猜传递引用意味着传递一个指针。但为什么不称之为传递指针呢?
因为在C语言中,每个参数都是按值传递(pass-by-value)。即使是指针参数也是一份拷贝。但它包含(或者说指向)相同的值——内存地址。这就是你可以改变它所指向的变量而不是指针本身的原因。由于它是一份拷贝,无论你做什么都不会影响调用者层面上的指针。
C++中,我们既有指针又有引用(以及类似迭代器的东西)。那么,这里的传递引用是什么意思?
这意味着,参数是调用者层面上变量的别名,而不是拷贝,这使得我们可以改变它。
希望这有所帮助。
按值传递:
你将一份房子的复制品交给油漆工 =>
需要很多努力(可能需要在轨道上移动)按引用传递:
你将你的房子地址交给油漆工,这样他就可以来涂漆了。“引用”一般是指一个实例在引用另一个实例。因此,从更广泛的意义上讲,指针也可以被视为引用的一种可能实现。在C++中,“引用”只是称之为“引用”,因为除了引用一些内容之外,它们没有其他功能。
按引用传递通常用于与按值传递区分开来。无论是通过指针还是引用方式,这通常只是一个细节问题。然而,在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)
C语言中有两个概念
1. 值传递 - 这里传递的是值的副本,因此函数外部的实际值不会改变。
2. 引用传递 - 这里传递的是实际操作数的地址,因此它将全局更改这些值。
C++中有两个概念
1. 值传递 - 它与C相同,实际值不会改变,这些值的作用域仅限于函数。
2. 引用传递 - 传递实际操作数的地址,因此它将全局更改这些值,这意味着如果值发生更改,则会影响整个程序。
在引用传递中,传递操作数的地址,因此称为引用传递而不是指针。