按引用传递和按地址传递之间的区别
Differences between passing by reference and passing by address
int func(int a, int& b){
if (a < 3){
return b;
} else{
b++;
return func( a/10, b);
}
}
我认为这里的b是通过指针传递的,这与通过引用传递是一样的。什么是地址传递,它与引用传递有何不同?上面有没有变量是通过地址传递的?另外,为什么 func(40, 0) 给我一个错误输出?
实际上,按引用传递或按指针传递之间没有太大区别。一些编译器就像 MSVC 模型引用一样。
然而,当查看细节时,它包含一些令人惊讶的元素:
- 引用看起来像常规变量,因此不需要到处都是 * 或 ->
- References 不能是 nullptr,允许 static_cast 稍微更高效的代码(当你碰巧实现它时,它是未定义的行为)
- 引用没有固定的内存占用,实际上它是一个指针,但是,你不能依赖它
- 无法重新分配引用,只能更改它指向的内容
- 引用与 C 不兼容
通常,您可以将引用视为指针的特例(反之亦然)。
就个人而言,我尽量使用引用,只在需要时才回退到指针。
让我试着让你用通俗易懂的方式理解。当您在 C++ 程序中声明任何变量时,编译器会在符号 table 中为该变量创建一个条目,然后在为其提供的内存中创建一个适当的 space 。
在引用变量的情况下,符号 table 中将有一个新条目,它具有与引用变量相同的存储空间,以后不会为它分配 space,它只是一个像你这样的别名可以用两个名字(如名字、昵称)来引用。
现在让我们以指针变量为例。不管它是一个指针,但它是一个变量,所以它也会有一个符号 table 条目,稍后会为它分配 space 。
所以从上面的陈述中你可以很容易地找到地址(指针)和引用变量之间的以下区别
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;
}
int func(int a, int& b){
if (a < 3){
return b;
} else{
b++;
return func( a/10, b);
}
}
我认为这里的b是通过指针传递的,这与通过引用传递是一样的。什么是地址传递,它与引用传递有何不同?上面有没有变量是通过地址传递的?另外,为什么 func(40, 0) 给我一个错误输出?
实际上,按引用传递或按指针传递之间没有太大区别。一些编译器就像 MSVC 模型引用一样。
然而,当查看细节时,它包含一些令人惊讶的元素:
- 引用看起来像常规变量,因此不需要到处都是 * 或 ->
- References 不能是 nullptr,允许 static_cast 稍微更高效的代码(当你碰巧实现它时,它是未定义的行为)
- 引用没有固定的内存占用,实际上它是一个指针,但是,你不能依赖它
- 无法重新分配引用,只能更改它指向的内容
- 引用与 C 不兼容
通常,您可以将引用视为指针的特例(反之亦然)。 就个人而言,我尽量使用引用,只在需要时才回退到指针。
让我试着让你用通俗易懂的方式理解。当您在 C++ 程序中声明任何变量时,编译器会在符号 table 中为该变量创建一个条目,然后在为其提供的内存中创建一个适当的 space 。 在引用变量的情况下,符号 table 中将有一个新条目,它具有与引用变量相同的存储空间,以后不会为它分配 space,它只是一个像你这样的别名可以用两个名字(如名字、昵称)来引用。 现在让我们以指针变量为例。不管它是一个指针,但它是一个变量,所以它也会有一个符号 table 条目,稍后会为它分配 space 。
所以从上面的陈述中你可以很容易地找到地址(指针)和引用变量之间的以下区别 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;
}