基本概念:函数的传值(4)

基本概念:函数的传值(4)

参数是一个指针的引用  的分析。

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的地址呢。

 

今天淘宝的书到了。晚上回家。就有书看了。呵呵。

你可能感兴趣的:(基本概念:函数的传值(4))