按引用传递和按地址传递之间的差异

Differences between passing by reference and passing by address

本文关键字:之间 址传 地址 按引用传递      更新时间:2023-10-16
int func(int a, int& b){
if (a < 3){
return b;
} else{
b++;
return func( a/10, b);
}
}

我认为这里的 b 是通过指针传递的,这与通过引用传递相同。什么是按地址传递,它与按引用传递有何不同?上面是否有任何变量是通过地址传递的?另外,为什么 func(40, 0( 给我一个错误作为输出?

让我试着用简单的方式让你理解。当您在 c++ 程序中声明任何变量时,编译器会在符号表中为该变量创建一个条目,然后在内存中为其提供适当的空间。 如果是引用变量,则符号表中将有一个新条目,该条目具有相同的引用变量存储,以后不会为其分配空间,它只是一个别名,就像您可能被两个名称(如名称,昵称(引用一样。 现在让我们以指针变量为例。不管它是一个指针,但它是一个变量,所以它也将有一个符号表条目,稍后将为其分配空间。

因此,从上面的语句中,您可以轻松找到地址(指针(和引用变量之间的以下区别 1( 不会为引用变量分配额外的内存,但对于指针变量,将有 4 或 8 个字节,具体取决于您要为其编译和运行代码的系统(32 位或 64 位操作系统(。 2(您以后通常无法尊重引用变量,因此您无法更改引用,但在指针变量的情况下,它可以包含不同的指针。

这同样适用于按引用传递和按地址传递。希望它能帮助您更好地理解。

尝试执行下面的代码,你会发现变量和引用变量的地址是相同的

int main()
{
int i = 10;
int& j = i;
printf(" address of i = %u address of j = %u", &i, &j);
return 0;
}

在实践中,通过引用传递或通过指针传递之间没有太大区别。一些编译器喜欢 MSVC 模型引用完全一样。

然而,在查看细节时,它包含一些令人惊讶的元素:

  • 引用看起来像常规变量,因此不需要到处使用 * 或 ->
  • 引用不能为 nullptr,允许static_cast性能稍高的代码(当你碰巧实现它时,它是未定义的行为(
  • 引用没有固定的内存占用,实际上它与指针相同,但是,您不能依赖它
  • 引用不能重新分配,只能更改它指向的内容
  • 引用与 C 不兼容

通常,您可以将引用视为指针的特殊情况(反之亦然(。 就个人而言,我尽可能使用引用,并且仅在需要时回退到指针。