通过引用传递和通过地址传递之间的区别

时间:2018-09-05 04:55:54

标签: c++ parameter-passing pass-by-reference

int func(int a, int& b){
   if (a < 3){
       return b;
   } else{
       b++;
       return func( a/10, b);
   }
}

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

2 个答案:

答案 0 :(得分:1)

在实践中,通过引用传递或通过指针传递之间没有太大区别。诸如MSVC模型之类的一些编译器正是这样引用的。

但是,当查看细节时,它包含一些令人惊讶的元素:

  • 引用看起来像常规变量,所以到处都不需要*或->
  • 引用不能为nullptr,从而为static_cast提供更多性能代码(当您碰巧实现时,这是未定义的行为)
  • 引用没有固定的内存占用,实际上,它是一个指针,但是,您不能依赖它
  • 仅可以更改引用所指向的内容才能重新分配引用
  • 参考文献与C不兼容

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

答案 1 :(得分:1)

让我尝试让您轻松理解。当您在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;
}