数据加载中……

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

无语。发现 windows live writer 跟google输入法有冲突。把边栏打开,输入法就用不了。

继续函数的传值。现在应该是按引用传递了。看代码:


class A
{
    public:
        int i;
        int ii;
        int iii;
        char iiii;
        char iiiii;
};

void fun1(A* a){
    a->iiii  = 'a';
    a->iiiii = 'b';
}

void fun2(A& a){
    a.iiii  = 'c';
    a.iiiii = 'd';
}

 

fun1的汇编:

push    ebp
mov     ebp, esp
mov     eax, dword ptr ss:[ebp+8]
mov     byte ptr ds:[eax+C], 61
mov     ecx, dword ptr ss:[ebp+8]
mov     byte ptr ds:[ecx+D], 62
pop     ebp
retn

fun2的汇编:

push    ebp
mov     ebp, esp
mov     eax, dword ptr ss:[ebp+8]
mov     byte ptr ds:[eax+C], 63
mov     ecx, dword ptr ss:[ebp+8]
mov     byte ptr ds:[ecx+D], 64
pop     ebp
retn

有区别吗?没区别。指针,引用一样。

 

看调用的:

A a;
a.iii    = 1;
fun1(&a);

汇编

mov     dword ptr ss:[ebp-8], 1      ;a.iii赋值
lea     eax, dword ptr ss:[ebp-10]   ;a的地址
push    eax                                      ;a的地址压入栈
call      00401000                              ;fun1的地址

 

A b;
b.iii = 2;
fun2(b);

汇编

mov     dword ptr ss:[ebp-18], 2     ;b.iii赋值
lea     ecx, dword ptr ss:[ebp-20]    ;b的地址
push    ecx                                       ;b的地址压入栈
call      00401020                               ;fun2的地址             

 

结论:

把类的第一个成员变量的地址压入栈。

posted on 2007-08-08 23:09 冬天的林 阅读(424) 评论(2)  编辑 收藏 引用 所属分类: C++基础

评论

# re: 基本概念:函数的传值(3)  回复  更多评论   

写得不错,不过这都不是非常高深的东西。
能否研究一下指针引用
void fun(aaaaa *& p)
{
}
指针引用有很特别的用处
可是我一直没发现
2007-08-09 01:49 | czxskell

# re: 基本概念:函数的传值(3)  回复  更多评论   

好的。我中午研究研究。
2007-08-09 09:30 | 冬天的林

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理