老钟古

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

简单的介绍一下指针和引用的区别,重点是引用。

#include <iostream>
#include 
<cstdio>
using namespace std;

int main()
{
    
int ival = 1024, ival2 = 2048;
    
int *pi = &ival, *pi2 = &ival2;
    pi 
= pi2;
    cout 
<< *pi << endl;
    cout 
<< *pi2 << endl;
    cout 
<< pi << ' ' << pi2 << endl;

    
int &ri = ival, &ri2 = ival2;
    ri 
= ri2;
    cout 
<< ri << ' ' << ri2 << endl;

    
return 0;

} 

 从下面的简单分析中我们可以看到使用指针和引用的区别,

#include <iostream>
2:    #include <cstdio>
3:    using namespace std;
4:
5:    int main()
6:    {
00401580 55                   push        ebp
00401581 8B EC                mov         ebp,esp
00401583 83 EC 58             sub         esp,58h
00401586 53                   push        ebx
00401587 56                   push        esi
00401588 57                   push        edi
00401589 8D 7D A8             lea         edi,[ebp-58h]
0040158C B9 16 00 00 00       mov         ecx,16h
00401591 B8 CC CC CC CC       mov         eax,0CCCCCCCCh
00401596 F3 AB                rep stos    dword ptr [edi]
7:        /*
8:        double obj = 3.14;
9:        double *pd = &obj;
10:
11:       void *pv = &obj;
12:       pv = pd;
13:
14:       int a = 5;
15:       int *ip = &a;
16:       int *pa = 0;
17:       pa = ip;
18:       *pa = *ip;
19:       */
20:       int ival = 1024, ival2 = 2048;
00401598 C7 45 FC 00 04 00 00 mov         dword ptr [ebp-4],400h
0040159F C7 45 F8 00 08 00 00 mov         dword ptr [ebp-8],800h
21:       int *pi = &ival, *pi2 = &ival2;
004015A6 8D 45 FC             lea         eax,[ebp-4]
004015A9 89 45 F4             mov         dword ptr [ebp-0Ch],eax
004015AC 8D 4D F8             lea         ecx,[ebp-8]
004015AF 89 4D F0             mov         dword ptr [ebp-10h],ecx
22:       pi = pi2;
004015B2 8B 55 F0             mov         edx,dword ptr [ebp-10h]
004015B5 89 55 F4             mov         dword ptr [ebp-0Ch],edx
23:       cout << *pi << endl;
004015B8 68 CD 10 40 00       push        offset @ILT+200(std::endl) (004010cd)
004015BD 8B 45 F4             mov         eax,dword ptr [ebp-0Ch]
004015C0 8B 08                mov         ecx,dword ptr [eax]
004015C2 51                   push        ecx
004015C3 B9 E0 77 47 00       mov         ecx,offset std::cout (004777e0)
004015C8 E8 37 FB FF FF       call        @ILT+255(std::basic_ostream<char,std::char_traits<char> >::operator<<) (00401104)
004015CD 8B C8                mov         ecx,eax
004015CF E8 16 FC FF FF       call        @ILT+485(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004011ea)
24:       cout << *pi2 << endl;
004015D4 68 CD 10 40 00       push        offset @ILT+200(std::endl) (004010cd)
004015D9 8B 55 F0             mov         edx,dword ptr [ebp-10h]
004015DC 8B 02                mov         eax,dword ptr [edx]
004015DE 50                   push        eax
004015DF B9 E0 77 47 00       mov         ecx,offset std::cout (004777e0)
004015E4 E8 1B FB FF FF       call        @ILT+255(std::basic_ostream<char,std::char_traits<char> >::operator<<) (00401104)
004015E9 8B C8                mov         ecx,eax
004015EB E8 FA FB FF FF       call        @ILT+485(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004011ea)
25:       cout << pi << ' ' << pi2 << endl;
004015F0 68 CD 10 40 00       push        offset @ILT+200(std::endl) (004010cd)
004015F5 8B 4D F0             mov         ecx,dword ptr [ebp-10h]
004015F8 51                   push        ecx
004015F9 6A 20                push        20h
004015FB 8B 55 F4             mov         edx,dword ptr [ebp-0Ch]
004015FE 52                   push        edx
004015FF B9 E0 77 47 00       mov         ecx,offset std::cout (004777e0)
00401604 E8 38 FA FF FF       call        @ILT+60(std::basic_ostream<char,std::char_traits<char> >::operator<<) (00401041)
00401609 50                   push        eax
0040160A E8 B3 FB FF FF       call        @ILT+445(std::operator<<) (004011c2)
0040160F 83 C4 08             add         esp,8
00401612 8B C8                mov         ecx,eax
00401614 E8 28 FA FF FF       call        @ILT+60(std::basic_ostream<char,std::char_traits<char> >::operator<<) (00401041)
00401619 8B C8                mov         ecx,eax
0040161B E8 CA FB FF FF       call        @ILT+485(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004011ea)
26:
27:       int &ri = ival, &ri2 = ival2;
00401620 8D 45 FC             lea         eax,[ebp-4]
00401623 89 45 EC             mov         dword ptr [ebp-14h],eax
00401626 8D 4D F8             lea         ecx,[ebp-8]
00401629 89 4D E8             mov         dword ptr [ebp-18h],ecx
28:       ri = ri2;
0040162C 8B 55 EC             mov         edx,dword ptr [ebp-14h]
0040162F 8B 45 E8             mov         eax,dword ptr [ebp-18h]
00401632 8B 08                mov         ecx,dword ptr [eax]
00401634 89 0A                mov         dword ptr [edx],ecx
29:       cout << ri << ' ' << ri2 << endl;
00401636 68 CD 10 40 00       push        offset @ILT+200(std::endl) (004010cd)
0040163B 8B 55 E8             mov         edx,dword ptr [ebp-18h]
0040163E 8B 02                mov         eax,dword ptr [edx]
00401640 50                   push        eax
00401641 6A 20                push        20h
00401643 8B 4D EC             mov         ecx,dword ptr [ebp-14h]
00401646 8B 11                mov         edx,dword ptr [ecx]
00401648 52                   push        edx
00401649 B9 E0 77 47 00       mov         ecx,offset std::cout (004777e0)
0040164E E8 B1 FA FF FF       call        @ILT+255(std::basic_ostream<char,std::char_traits<char> >::operator<<) (00401104)
00401653 50                   push        eax
00401654 E8 69 FB FF FF       call        @ILT+445(std::operator<<) (004011c2)
00401659 83 C4 08             add         esp,8
0040165C 8B C8                mov         ecx,eax
0040165E E8 A1 FA FF FF       call        @ILT+255(std::basic_ostream<char,std::char_traits<char> >::operator<<) (00401104)
00401663 8B C8                mov         ecx,eax
00401665 E8 80 FB FF FF       call        @ILT+485(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004011ea)
30:
31:       return 0;
0040166A 33 C0                xor         eax,eax
32:   }
0040166C 5F                   pop         edi
0040166D 5E                   pop         esi
0040166E 5B                   pop         ebx
0040166F 83 C4 58             add         esp,58h
00401672 3B EC                cmp         ebp,esp
00401674 E8 D7 F5 01 00       call        __chkesp (00420c50)
00401679 8B E5                mov         esp,ebp
0040167B 5D                   pop         ebp

0040167C C3                   ret 

posted on 2011-02-26 10:00  老钟古  阅读(479)  评论(0编辑  收藏  举报