const的运用
const int i=10;
int & ir=(int&)i;
ir=5;
printf("%d %d %d %d\n",ir,i,&ir,&i);
输出之后发现ir和i的地址是一样的,但ir输出5,i输出10,这是为什么
[解决办法]
编译器提前将所有的i替换成了10,所以i被修改之后没有被输出出来,其实i已经被改为5了。
const int i=10;002B13BE mov dword ptr [i],0Ah //i的值 int & ir=(int&)i;002B13C5 lea eax,[i] 002B13C8 mov dword ptr [ir],eax ir=5;002B13CB mov eax,dword ptr [ir] 002B13CE mov dword ptr [eax],5 printf("%d %d %d %d\n",ir,i,&ir,&i);002B13D4 mov esi,esp 002B13D6 lea eax,[i] 002B13D9 push eax 002B13DA mov ecx,dword ptr [ir] //输出了ir002B13DD push ecx 002B13DE push 0Ah //这里没有输出i中修改过的值,因为编译器给优化了002B13E0 mov edx,dword ptr [ir] 002B13E3 mov eax,dword ptr [edx] 002B13E5 push eax 002B13E6 push offset string "%d %d\n" (2B7930h) 002B13EB call dword ptr [__imp__printf (2BA2B8h)] 002B13F1 add esp,14h 002B13F4 cmp esi,esp 002B13F6 call @ILT+300(__RTC_CheckEsp) (2B1131h) return 0;
[解决办法]
const int i=10;int & ir=(int&)i; ir=5;printf("%d %d %d %d\n",ir,i,&ir,&i);输出之后发现ir和i的地址是一样的,但ir输出5,i输出10,这是为什么//ir是对i的一个引用,即10;//由于ir是个变量,并没有用const修饰,当然可以改变它的值了,所以在执行完ir=5;//ir的值是5。
[解决办法]
不要纠结各种常量了,这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢!