传值、传引用、传指针函数调用的区别

void SwapByValue(int a,int b)
{
00311490  push        ebp  //设基值
00311491  mov         ebp,esp  
00311493  sub         esp,0CCh  
00311499  push        ebx  
0031149A  push        esi  
0031149B  push        edi  //源/目标索引寄存器
0031149C  lea         edi,[ebp-0CCh]  
003114A2  mov         ecx,33h  
003114A7  mov         eax,0CCCCCCCCh  
003114AC  rep stos    dword ptr es:[edi]  
	int temp;
	temp = a;
003114AE  mov         eax,dword ptr [a]  
003114B1  mov         dword ptr [temp],eax  
	a = b;
003114B4  mov         eax,dword ptr [b]  
003114B7  mov         dword ptr [a],eax  
	b = temp;
003114BA  mov         eax,dword ptr [temp]  
003114BD  mov         dword ptr [b],eax  

}
003114C0  pop         edi  
003114C1  pop         esi  
003114C2  pop         ebx  
003114C3  mov         esp,ebp  
003114C5  pop         ebp  
003114C6  ret  
void SwapByRef(int& a,int& b)
{
00311440  push        ebp  
00311441  mov         ebp,esp  
00311443  sub         esp,0CCh  
00311449  push        ebx  
0031144A  push        esi  
0031144B  push        edi  
0031144C  lea         edi,[ebp-0CCh]  
00311452  mov         ecx,33h  
00311457  mov         eax,0CCCCCCCCh  
0031145C  rep stos    dword ptr es:[edi]  
	int temp;
	temp = a;
0031145E  mov         eax,dword ptr [a]  
00311461  mov         ecx,dword ptr [eax]  
00311463  mov         dword ptr [temp],ecx  
	a = b;
00311466  mov         eax,dword ptr [a]  
00311469  mov         ecx,dword ptr [b]  
0031146C  mov         edx,dword ptr [ecx]  
0031146E  mov         dword ptr [eax],edx  
	b = temp;
00311470  mov         eax,dword ptr [b]  
00311473  mov         ecx,dword ptr [temp]  
00311476  mov         dword ptr [eax],ecx  
}
00311478  pop         edi  
00311479  pop         esi  
0031147A  pop         ebx  
0031147B  mov         esp,ebp  
0031147D  pop         ebp  
0031147E  ret  
void SwapByPointer(int* a, int* b)
{
003113E0  push        ebp  
003113E1  mov         ebp,esp  
003113E3  sub         esp,0CCh  
003113E9  push        ebx  
003113EA  push        esi  
003113EB  push        edi  
003113EC  lea         edi,[ebp-0CCh]  
003113F2  mov         ecx,33h  
003113F7  mov         eax,0CCCCCCCCh  
003113FC  rep stos    dword ptr es:[edi]  
	int* temp = NULL;
003113FE  mov         dword ptr [temp],0  
	*temp = *a;
00311405  mov         eax,dword ptr [temp]  
00311408  mov         ecx,dword ptr [a]  
0031140B  mov         edx,dword ptr [ecx]  
0031140D  mov         dword ptr [eax],edx  
	*a = *b;
0031140F  mov         eax,dword ptr [a]  
	*a = *b;
00311412  mov         ecx,dword ptr [b]  
00311415  mov         edx,dword ptr [ecx]  
00311417  mov         dword ptr [eax],edx  
	*b = *temp;
00311419  mov         eax,dword ptr [b]  
0031141C  mov         ecx,dword ptr [temp]  
0031141F  mov         edx,dword ptr [ecx]  
00311421  mov         dword ptr [eax],edx  
}
00311423  pop         edi  
00311424  pop         esi  
00311425  pop         ebx  
00311426  mov         esp,ebp  
00311428  pop         ebp  
00311429  ret  

阅读更多
个人分类: 编译器
想对作者说点什么? 我来说一句

总结函数传值方式

2012年08月02日 19KB 下载

C语言函数调用

2013年08月26日 1KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭