按引用传递和按地址传递之间的差异
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( 给我一个错误作为输出?
让我试着用简单的方式让你理解。当您在 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 模型引用完全一样。
然而,在查看细节时,它包含一些令人惊讶的元素:
- 引用看起来像常规变量,因此不需要到处使用 * 或 ->
- 引用不能为 nullptr,允许static_cast性能稍高的代码(当你碰巧实现它时,它是未定义的行为(
- 引用没有固定的内存占用,实际上它与指针相同,但是,您不能依赖它
- 引用不能重新分配,只能更改它指向的内容
- 引用与 C 不兼容
通常,您可以将引用视为指针的特殊情况(反之亦然(。 就个人而言,我尽可能使用引用,并且仅在需要时回退到指针。
相关文章:
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 将二维矢量传递给类
- int(c) 和 c-'0' 之间的区别。C++
- 在cuda线程之间共享大量常量数据
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 将char*传递给pthread_read函数
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 如何将 I->getType() 作为参数传递给 llvm 中的 CreateCall?
- 在c代码之间共享数据的最佳方式
- Mix_Init和Mix_OpenAudio SDL之间的区别是什么
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 将std::string传递给WriteConsole API
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 大小相等但成员数量不同的结构之间的性能差异
- 类与私有变量的其他类之间的线程安全性
- 指针声明和间接寻址之间的区别
- 将参数传递给C 中的基类构造函数之间的区别
- 传递 CString 和将 CString.GetBuffer 传递给 CString.Format 中的 %s 之间有