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模型参考的一些编译器就是这样的。
但是,在查看细节时,它包含一些令人惊讶的元素:
通常,您可以将引用视为指针的特殊情况(反之亦然)。就个人而言,我尽可能地尝试使用引用,并且只在需要时才会回退到指针。