好友
阅读权限10
听众
最后登录1970-1-1
|
【
#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;
}
】
|
-
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|