int func(int a, int& b){
if (a < 3){
return b;
} else{
b++;
return func( a/10, b);
}
}
我认为b是通过指针传递的,这与通过引用传递的相同。什么是按地址传递,与按引用传递有何不同?上面有没有通过地址传递的变量?另外,为什么func(40,0)给我输出错误?
答案 0 :(得分:1)
在实践中,通过引用传递或通过指针传递之间没有太大区别。诸如MSVC模型之类的一些编译器正是这样引用的。
但是,当查看细节时,它包含一些令人惊讶的元素:
通常,您可以将引用视为指针的特殊情况(反之亦然)。 就个人而言,我尝试尽可能使用引用,并且仅在需要时才使用指针。
答案 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;
}