zoukankan      html  css  js  c++  java
  • 指针引用的区别

    区别:

    1. 指针是对象,引用不是;

    2. 声明引用必须初始化,声明指针可以不初始化(但一般建议初始化);

    3. 指针可以绑定新的对象(花心大萝卜),而引用不可以(从一而终);

    4. 在作为参数时,引用要比指针高效,因为指针要发生实参到形参的拷贝,而引用不需要。

    实现机制:底层都是指针,都要分配内存(至少从汇编层面看是这样的)

     1 #include <iostream>
     2 using namespace std;
     3 
     4 int main()
     5 {
     6     int i = 100, other = 999;
     7     int &rr = i;//必须初始化
     8     int *p = &i;//可以不初始化
     9 
    10     return 0;
    11 }

    瞧一瞧汇编

    7:         int &rr = i;//必须初始化
    00401056   lea         eax,[ebp-4]
    00401059   mov         dword ptr [ebp-0Ch],eax
    8:         int *p = &i;//可以不初始化
    0040105C   lea         ecx,[ebp-4]
    0040105F   mov         dword ptr [ebp-10h],ecx
    lea         eax,[ebp-4] //将【ebp-4】中的值的地址存入eax中(也就是把ebp-4存入eax中)
    mov         dword ptr [ebp-0Ch],eax //将eax的地址存入地址为【ebp-0ch】的指针中

    指针和引用在汇编里头看是一毛一样的,可见引用还是用指针来实现的,没什么稀奇。

    值传递、指针传递、引用传递

    值传递: 实参初始化形参,二者互不影响;

    指针传递: 发生了指针的拷贝,还是两个对象,但是指向同一块内存/对象,可以通过形参指针修改对象值;

    引用传递: 别名,不发生拷贝,可以直接使用原对象,但我们一般用const限定常量引用,防止该值。const string &s;

  • 相关阅读:
    Atitit 图像金字塔原理与概率 attilax的理解总结qb23
    Atitit.软件中见算法 程序设计五大种类算法
    百度之星
    linux下编程IDE环境
    c++多态的实现 VC++消息映射的实现
    static_cast, const_cast,dynamic_cast和reinterpret_cast
    X Window研究笔记(1)~22
    关于串口发送短信
    模式识别中的核方法
    IC设计,verilog学习链接
  • 原文地址:https://www.cnblogs.com/yocichen/p/10374076.html
Copyright © 2011-2022 走看看