【发布时间】:2021-11-12 19:18:16
【问题描述】:
所以我了解如何将地址传递给 C 函数以避免传递值。但我不明白的是在 C++ 中通过引用传递。我对 C 缺乏理解,如果你通过引用传递变量,你只会得到一个基于地址的废话 int 值。比如你做了:
int x = 5;
int* p = x;
int y = p;
y 将是一个无意义的 int 值。所以我不明白基于上述逻辑的C++引用传递。是否有一些编译器标识您正在尝试执行的操作,以便以使其等效于 C 代码的方式对其进行编译?有关 C 和 C++ 的指针传递和引用传递,请参见下文:
// C pass by pointer value
void main() {
int a = 1;
int b = 2;
swap(&a, &b);
}
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
// C++ pass by reference
void main() {
int a = 1;
int b = 2;
swap(a, b);
}
void swap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
【问题讨论】:
-
C++ 引用只是指针的抽象。无论您使用的是引用还是指针,C++ 编译器都可能生成相同的代码。
-
不一定是这样。如果编译器可以内联解析名称,那么它可以简单地在其符号查找表中具有相同值的两个名称。
-
如何实现指针和引用并没有被标准指定。这完全取决于您使用的实现(即编译器、cpu 等)。我的猜测是,在大多数情况下,它们的实现方式相同。见godbolt.org/z/5Ws8zYcsY
-
"我缺乏理解来自 C,如果你通过引用传递变量,你只会得到一个基于地址的废话 int 值" - C 没有t 根本没有引用,只有指针。 C++ 有引用。
-
在 C 中引用引用并没有错。通过取消引用指针获得引用。 C 没有命名直接引用。