吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2379|回复: 2
收起左侧

[C&C++ 转载] 【笔记】传值 传地址 传引用

[复制链接]
2016wapjpc 发表于 2017-10-7 20:43

#include "stdafx.h"

void Test(int x )
{
        x = 1;
        //        00401038   mov         dword ptr [ebp+8],1//改掉了[ebp+8]上的2为1
   // 值传递, 把2复制到堆栈,改掉了堆栈上的2为1,并没有改ebp-4上的值
}
void Test2(int* x )
{
        *x = 2;
/*      
                传地址, 取ebp-8的地址放入edx中压栈
                0040B7F3 8D 55 F8             lea         edx,[ebp-8]
                0040B7F6 52                   push        edx
*/
/*                18:       *x = 1;
                00401068 8B 45 08             mov         eax,dword ptr [ebp+8]
                0040106B C7 00 01 00 00 00    mov         dword ptr [eax],1
                19:
                ebp+8是第一个参数,就是刚压入的edx的值,也就是b的地址,把1放到这个地址上,改掉了ebp-8上的值
*/
//如果我们一不小心把地址改掉了地址,
//        x =(int*)0x70000000;就会出现逻辑错误????,不能显示了,但是很可怕,指针传递灵活,但是不安全
}

void Test3(int& x )
{
        x =3;
/*          004010E8 8B 45 08             mov         eax,dword ptr [ebp+8]
        004010EB C7 00 03 00 00 00    mov         dword ptr [eax],3
*/
/*       

  在c++中,我们在函数调用时,像test(a),可能是int类型,也可能是int&类型,也就是传引用

  传引用在底层上和传指针是一样的,但是编译器不允许引用修改地址 ,只能改值,这样安全
*/

}

class Base
{
public:
        int x;
        int y;
        Base(int x ,int y)
        {
                this->x = x;
                this->y = y;
        }
};
void PrintPoint(Base* pb)
{
        printf("%d %d\n",pb->x,pb->y);

        pb =(Base*)0x123456 ; //指针可以为所欲为……………………………………

        printf("%d %d\n",pb->x,pb->y);// 出错了,修改了对象的地址
}

void PrintRef( Base& refb,Base* pb)
{
        printf("引用 :%d %d\n",refb.x,refb.y);

    printf("指针 lei: %d %d\n",pb->x,pb->y);


        Base c(33,44);
        refb = c;  //把c这个对象的x,y值给 refb代表的lei对象的x,y
/*
                76:       Base c(33,44);
                004011BC 6A 2C                push        2Ch
                004011BE 6A 21                push        21h
                004011C0 8D 4D F8             lea         ecx,[ebp-8]//c这个对象的地址 ,33的地址
                004011C3 E8 4C FE FF FF       call        @ILT+15(Base::Base) (00401014)
                77:       refb = c;  //把c这个对象的x,y值给 refb代表的lei对象的x,y
                004011C8 8B 55 08             mov         edx,dword ptr [ebp+8]//lei的地址
                004011CB 8B 45 F8             mov         eax,dword ptr [ebp-8]  
                004011CE 89 02                mov         dword ptr [edx],eax   33放到 lei的地址上
                004011D0 8B 4D FC             mov         ecx,dword ptr [ebp-4]  
                004011D3 89 4A 04             mov         dword ptr [edx+4],ecx  44放到lei的y的地址上
                78:
*/

    printf("引用 :%d %d\n",refb.x,refb.y);
   printf("指针 lei: %d %d\n",pb->x,pb->y);

}

int main(int argc, char* argv[])
{

        int a =4;
        Test(a);     // 值传递
         
        printf("%d\n", a);
       
        int b = 5;
    Test2(&b );   //传指针
    printf("%d\n", b);


       
        int c = 6;
       Test3(c );  //传引用
        printf("%d\n", c);

        Base Lei(1,2);

        PrintPoint(&Lei);  //出错了,修改了对象的地址


        PrintRef(Lei,&Lei);

        return 0;
}




捕获.PNG

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

wushiheike 发表于 2017-10-10 21:59
谢谢,学习了!!
头像被屏蔽
king8222 发表于 2017-11-13 18:41
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 08:21

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表