简单的介绍一下指针和引用的区别,重点是引用。
#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 <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
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