2016wapjpc 发表于 2017-10-7 20:43

【笔记】传值 传地址 传引用


#include "stdafx.h"

void Test(int x )
{
        x = 1;
        //        00401038   mov         dword ptr ,1//改掉了上的2为1
   // 值传递, 把2复制到堆栈,改掉了堆栈上的2为1,并没有改ebp-4上的值
}
void Test2(int* x )
{
        *x = 2;
/*      
                传地址, 取ebp-8的地址放入edx中压栈
                0040B7F3 8D 55 F8             lea         edx,
                0040B7F6 52                   push      edx
*/
/*                18:       *x = 1;
                00401068 8B 45 08             mov         eax,dword ptr
                0040106B C7 00 01 00 00 00    mov         dword ptr ,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
      004010EB C7 00 03 00 00 00    mov         dword ptr ,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,//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 //lei的地址
                004011CB 8B 45 F8             mov         eax,dword ptr
                004011CE 89 02                mov         dword ptr ,eax   33放到 lei的地址上
                004011D0 8B 4D FC             mov         ecx,dword ptr
                004011D3 89 4A 04             mov         dword ptr ,ecx44放到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;
}




wushiheike 发表于 2017-10-10 21:59

谢谢,学习了!!

king8222 发表于 2017-11-13 18:41

页: [1]
查看完整版本: 【笔记】传值 传地址 传引用