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

学习 时间:2026-04-07 18:23:44 阅读:7918
pass by value 和pass by reference有什么区别?求救,

最佳回答

细腻的小熊猫

殷勤的灰狼

2026-04-07 18:23:44

直接那一个别人写的挺详细的复制给你: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]前者是传值 ,后者是传址。重要的是区别就是:传值:外面(函数外面)的地址与里面(函数里面)操作的数(内容)(的地址)不是同一个,所以根本没有修改。传地址:外面(函数外面)的地址与里面(函数里面)操作的数(内容)的地址是同一个,所以在函数里面修改的话,影响外面。

最新回答共有2条回答

  • 重要的小蝴蝶
    回复
    2026-04-07 18:23:44

    直接那一个别人写的挺详细的复制给你: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]前者是传值 ,后者是传址。重要的是区别就是:传值:外面(函数外面)的地址与里面(函数里面)操作的数(内容)(的地址)不是同一个,所以根本没有修改。传地址:外面(函数外面)的地址与里面(函数里面)操作的数(内容)的地址是同一个,所以在函数里面修改的话,影响外面。

上一篇 22分之15×5分之2×2分之5等于多少

下一篇 关于诺言的词语与句子越多越好