pass by value 和pass by reference有什么区别?求救,

来源:学生作业帮助网 编辑:作业帮 时间:2024/05/03 15:30:35
pass by value 和pass by reference有什么区别?求救,

pass by value 和pass by reference有什么区别?求救,
pass by value 和pass by reference有什么区别?求救,

pass by value 和pass by reference有什么区别?求救,
直接那一个别人写的挺详细的复制给你:
1.pass by value
i := 10;
mov esi,$0000000a // esi的值就是10 (i使用esi寄存器)
j := 5;
mov edi,$00000005 // esi的值就是5 (j使用edi寄存器)
Edit1.Text := IntToStr(Params.SwapByValue(i,j));
mov edx,edi // edx中的值是edi中的值,即同为j的值,注意 不是j的地址!
mov eax,esi // esi中的值是esi中的值,即同为i的值,注意 不是i的地址!
call SwapByValue // 所以成为 pass-by-value
lea edx,[ebp-$04]
call IntToStr
////////////////////////////// SwapByValue
tmp := i;
mov ecx,eax // eax的值为i的值,传给ecx,(tmp使用ecx寄存器,这是编译器的优化),注意 不是i的地址!
i := j;
mov eax,edx // edx的值为j的值,传给eax,(eax中原值为i,而不是i的地址!)
j := tmp;
mov edx,ecx // ecx中的值为tmp(i)的值,传给edx,(edx原值为j,而不是j的地址!)
// 所以更改后 对函数外面的参数 根本没有影响.
Result := i + j;
add edx,eax
mov eax,edx
///////////////////////////////////////////
2.pass by reference
i := 10;
mov [ebp-$04],$0000000a // i使用内存 非寄存器 因为对寄存器不能进行取地址
j := 5;
mov [ebp-$08],$00000005 // j使用内存 非寄存器 因为对寄存器不能进行取地址
Edit1.Text := IntToStr(Params.SwapByRef(i,j)); // 注意参数压栈方式为 从右到左
lea edx,[ebp-$08] // 注意!edx为j的地址 j使用内存 非寄存器 因为对寄存器不能进行取地址
lea eax,[ebp-$04] // 注意!eax为i的地址 i使用内存 非寄存器 因为对寄存器不能进行取地址
call SwapByRef // here
lea edx,[ebp-$0c]
call IntToStr
//////////////////////////////// SwapByRef
tmp := i;
mov ecx,[eax] // eax为一个指针,里面的值为变量i的地址,所以需要再寻址一次 通过[eax]
i := j;
mov ebx,[edx] // edx为一个指针,里面的值为变量j的地址,ebx为j的值
mov [eax],ebx // 把eax这个指针指向的地址的值赋为ebx(j),注意!eax的内容就是函数外i的地址,
// 所以相当于直接修改i的内容,所以i被修改!
j := tmp;
mov [edx],ecx // ecx的值为tmp(i),
// 把edx这个指针指向的地址的值赋为ecx(tmp/i),注意!edx的内容就是函数外j的地址,
// 所以相当于直接修改j的内容,所以j被修改!
Result := i + j;
mov eax,[eax]
add eax,[edx]
前者是传值 ,后者是传址.
重要的是区别就是:
传值:外面(函数外面)的地址与里面(函数里面)操作的数(内容)(的地址)不是同一个,所以根本没有修改.
传地址:外面(函数外面)的地址与里面(函数里面)操作的数(内容)的地址是同一个,所以在函数里面修改的话,影响外面.