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

问题描述 投票:-1回答:2
int func(int a, int& b){
   if (a < 3){
       return b;
   } else{
       b++;
       return func( a/10, b);
   }
}

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

c++ parameter-passing pass-by-reference
2个回答
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;
}

1
投票

在实践中,通过引用传递或通过指针传递没有太大区别。像MSVC模型参考的一些编译器就是这样的。

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

  • 引用看起来像常规变量,所以不需要*或 - >
  • 引用不能是nullptr,允许稍微更高效的static_cast代码(当你碰巧实现它时,它是未定义的行为)
  • 引用没有固定的内存占用,实际上它是一个指针,但是,你不能依赖它
  • 不能重新分配引用,只能指向它可以更改的内容
  • 参考文献与C不兼容

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

© www.soinside.com 2019 - 2024. All rights reserved.