参数是一个指针的引用 的分析。
C++ Primer有这方面的介绍。看了以后不是很明白。
先来一个常规的:
void fun2(int *a, int *b){
int tem = *b;
*b = *a;
*a = tem;
}
调用;
int a = 1;
int b = 2;
int *a1 = &a;
int *b1 = &b;
fun2(a1,b1);
运行之后。a,b的值互换,a1 的值是a的地址。b1的值是b的地址。指针的值没变。
看看参数是一个指针的引用的:
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);
结果是:a1 跟 b1 的值交换。a1的值是b的地址,b1的值是a的地址。 a,b的值不变。也就是说,指针的值改变了。a,b的值没有变。
汇编代码:
调用的:
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 ; 参数2 从右向左压栈的
lea eax, dword ptr ss:[ebp-8] ;a1的地址
push eax ; 参数1
call 00401000 ; fun1的地址
fun1的汇编:
mov eax, dword ptr ss:[ebp+C] ;参数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] ;参数2 b1的地址
mov eax, dword ptr ss:[ebp+8] ;参数1 a1的地址
mov ecx, dword ptr ds:[eax] ;ecx为 a1的值 a的地址
mov dword ptr ds:[edx], ecx ;b1的值 现在就是a的地址呢。
mov edx, dword ptr ss:[ebp+8] ;参数1 a1的地址
mov eax, dword ptr ss:[ebp-4] ;tem的值 以前b1的值 b的地址
mov dword ptr ds:[edx], eax ;a1的值 现在就是b的地址呢。
今天淘宝的书到了。晚上回家。就有书看了。呵呵。