【笔记】传值 传地址 传引用
【#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;
}
】
谢谢,学习了!!
页:
[1]