数据加载中……

基本概念:函数的传值(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的地址呢。

 

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

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

评论

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

void fun3(int *a, int *b){
int* tem = b;
b = a;
a = tem;
}

int a = 1;
int b = 2;
int *a1 = &a;
int *b1 = &b;
fun3(a1,b1);

和fun2功能一样吧。
fun2我真还理解进去。
2007-08-09 20:19 | pass86

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

不知道大哥。运行过fun3没?看过结果没?
2007-08-09 21:11 | 冬天的林

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

这样的文章建议发在新手区!
2007-08-09 21:53 | dudu

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

这个似乎问题确实是出乎意料,我做了测试,fun3没有改变指针值,GOOD。
//测试代码
#include <iostream>
using namespace std;
void fun1(int*& a, int*& b)
{
int* tem = b;
b = a;
a = tem;
}

void fun2(int* a, int* b)
{
int tem = *b;
*b = *a;
*a = tem;
}
void fun3(int* a, int* b)
{
int* tem = b;
b = a;
a = tem;
}

int main()
{
{
int a = 1;
int b = 2;
int* a1 = &a;
int* b1 = &b;
cout << a << ", " << b << endl;
cout << a1 << ", " << b1 << endl;
fun1(a1, b1);
cout << a << ", " << b << endl;
cout << a1 << ", " << b1 << endl;
}
{
int a = 1;
int b = 2;
int* a1 = &a;
int* b1 = &b;
cout << a << ", " << b << endl;
cout << a1 << ", " << b1 << endl;
fun2(a1, b1);
cout << a << ", " << b << endl;
cout << a1 << ", " << b1 << endl;
}
{
int a = 1;
int b = 2;
int* a1 = &a;
int* b1 = &b;
cout << a << ", " << b << endl;
cout << a1 << ", " << b1 << endl;
fun3(a1, b1);
cout << a << ", " << b << endl;
cout << a1 << ", " << b1 << endl;
}

return 0;
}
//测试结果:
1, 2
0x22ff74, 0x22ff70
1, 2
0x22ff70, 0x22ff74
1, 2
0x22ff68, 0x22ff6c
2, 1
0x22ff68, 0x22ff6c
1, 2
0x22ff68, 0x22ff6c
1, 2
0x22ff68, 0x22ff6c
2007-08-09 22:59 | pass86

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

好的。

@dudu
2007-08-10 09:09 | 冬天的林

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

@pass86

呵呵。谢谢关注。
2007-08-10 09:10 | 冬天的林

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

暴汗,还有人这么玩!==!
2007-08-11 14:38 | XTSHMF

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理