參數(shù)是一個(gè)指針的引用 的分析。
C++ Primer有這方面的介紹。看了以后不是很明白。
先來一個(gè)常規(guī)的:
void fun2(int *a, int *b){
int tem = *b;
*b = *a;
*a = tem;
}
調(diào)用;
int a = 1;
int b = 2;
int *a1 = &a;
int *b1 = &b;
fun2(a1,b1);
運(yùn)行之后。a,b的值互換,a1 的值是a的地址。b1的值是b的地址。指針的值沒變。
看看參數(shù)是一個(gè)指針的引用的:
void fun1(int *&a, int *&b){
int *tem = b;
b = a;
a = tem;
}
int a = 1;
int b = 2;
int *a1 = &a;
int *b1 = &b;
fun1(a1,b1);
結(jié)果是:a1 跟 b1 的值交換。a1的值是b的地址,b1的值是a的地址。 a,b的值不變。也就是說,指針的值改變了。a,b的值沒有變。
匯編代碼:
調(diào)用的:
mov dword ptr ss:[ebp-4], 1 ;a
mov dword ptr ss:[ebp-C], 2 ;b
lea eax, dword ptr ss:[ebp-4] ;a的地址
mov dword ptr ss:[ebp-8], eax ;給*a1賦值
lea ecx, dword ptr ss:[ebp-C] ;b的地址
mov dword ptr ss:[ebp-10], ecx ;給*b1賦值
lea edx, dword ptr ss:[ebp-10] ;b1的地址
push edx ; 參數(shù)2 從右向左壓棧的
lea eax, dword ptr ss:[ebp-8] ;a1的地址
push eax ; 參數(shù)1
call 00401000 ; fun1的地址
fun1的匯編:
mov eax, dword ptr ss:[ebp+C] ;參數(shù)2 b1的地址
mov ecx, dword ptr ds:[eax] ;ecx為 b1的值 b的地址
mov dword ptr ss:[ebp-4], ecx ;b1的值 b的地址 給tem
mov edx, dword ptr ss:[ebp+C] ;參數(shù)2 b1的地址
mov eax, dword ptr ss:[ebp+8] ;參數(shù)1 a1的地址
mov ecx, dword ptr ds:[eax] ;ecx為 a1的值 a的地址
mov dword ptr ds:[edx], ecx ;b1的值 現(xiàn)在就是a的地址呢。
mov edx, dword ptr ss:[ebp+8] ;參數(shù)1 a1的地址
mov eax, dword ptr ss:[ebp-4] ;tem的值 以前b1的值 b的地址
mov dword ptr ds:[edx], eax ;a1的值 現(xiàn)在就是b的地址呢。
今天淘寶的書到了。晚上回家。就有書看了。呵呵。