C++复合类型

4 篇文章 0 订阅

C++的复合类型分为两种:引用和指针

引用就是为对象取一个别名 (”左值引用 lvalue reference”)

举一个小例子

#include <iostream>

//compound  Type
int main()
{
    int i, &ri = i;
    i = 5;
    ri = 10;
    std::cout << i << "  " << ri << std::endl;

    getchar();
    system("pause");
    return 0;
}

在汇编中代码

#include <iostream>

//compound  Type
int main()
{
01372420  push        ebp  
01372421  mov         ebp,esp  
01372423  sub         esp,0DCh  
01372429  push        ebx  
0137242A  push        esi  
0137242B  push        edi  
0137242C  lea         edi,[ebp-0DCh]  
01372432  mov         ecx,37h  
01372437  mov         eax,0CCCCCCCCh  
0137243C  rep stos    dword ptr es:[edi]  
0137243E  mov         eax,dword ptr [__security_cookie (0137B004h)]  
01372443  xor         eax,ebp  
01372445  mov         dword ptr [ebp-4],eax  
    int i, &ri = i;
01372448  lea         eax,[i]    //这里把i存放eax寄存器中
0137244B  mov         dword ptr [ri],eax  //把寄存器eax的值存放内存地址0137244B中
    i = 5;
0137244E  mov         dword ptr [i],5    //对这个i进行赋值
    ri = 10;
01372455  mov         eax,dword ptr [ri] //引用是直接寄存器eax赋值
01372458  mov         dword ptr [eax],0Ah  
    std::cout << i << "  " << ri << std::endl;
0137245E  mov         esi,esp  
01372460  push        offset std::endl<char,std::char_traits<char> > (01371087h)  
01372465  mov         edi,esp  
01372467  mov         eax,dword ptr [ri]  
0137246A  mov         ecx,dword ptr [eax]  
0137246C  push        ecx  
0137246D  push        offset string "  " (01378B30h)  
01372472  mov         ebx,esp  
01372474  mov         edx,dword ptr [i]  
01372477  push        edx  
01372478  mov         ecx,dword ptr [_imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A (0137C098h)]  
0137247E  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (0137C0A4h)]  
01372484  cmp         ebx,esp  
01372486  call        __RTC_CheckEsp (01371159h)  
0137248B  push        eax  
0137248C  call        std::operator<<<std::char_traits<char> > (01371375h)  
01372491  add         esp,8  
01372494  mov         ecx,eax  
01372496  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (0137C0A4h)]  
0137249C  cmp         edi,esp  
0137249E  call        __RTC_CheckEsp (01371159h)  
013724A3  mov         ecx,eax  
013724A5  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (0137C0A8h)]  
013724AB  cmp         esi,esp  
013724AD  call        __RTC_CheckEsp (01371159h)  

    getchar();
013724B2  mov         esi,esp  
013724B4  call        dword ptr [__imp__getchar (0137C1F4h)]  
013724BA  cmp         esi,esp  
013724BC  call        __RTC_CheckEsp (01371159h)  
    system("pause");
013724C1  mov         esi,esp  
013724C3  push        offset string "pause" (01378BD0h)  
013724C8  call        dword ptr [__imp__system (0137C1F8h)]  
013724CE  add         esp,4  
013724D1  cmp         esi,esp  
013724D3  call        __RTC_CheckEsp (01371159h)  
    return 0;
013724D8  xor         eax,eax  
}

指针

指针值有四种状态

  1. 指向一个对象
  2. 指向紧邻对象所占空间的下一个位置
  3. 空指针,意味着指针没有指向任何对象
  4. 无效指针,也就是上述情况之外的其他值

&和*的使用区别

int i = 42;
    int &r = i;
    int *p;
    p = &i;
    *p = i;
    int &r2 = *p;
011E1E65  mov         dword ptr [ebp-4],eax  
    int i = 42;
011E1E68  mov         dword ptr [i],2Ah  
    int &r = i;
011E1E6F  lea         eax,[i]  
011E1E72  mov         dword ptr [r],eax  
    int *p;
    p = &i;
011E1E75  lea         eax,[i]  
011E1E78  mov         dword ptr [p],eax  
    *p = i;
011E1E7B  mov         eax,dword ptr [p]  
011E1E7E  mov         ecx,dword ptr [i]  
011E1E81  mov         dword ptr [eax],ecx  
    int &r2 = *p;
011E1E83  mov         eax,dword ptr [p]  
011E1E86  mov         dword ptr [r2],eax  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值