这就是编译器对常数的处理。经单步发现,当显示m时,并不是在m位置处取数,而是直接将常数0xC8(200)压入栈供cout显示,下述编译后的汇编代码可以很清楚看到:
10: cout << n << endl;
004017BE push offset @ILT+200(std::endl) (004010cd)
004017C3 mov edx,dword ptr [ebp-8] //ebp-8是变量n的地址,这时n的内容为m的地址,可以看到n实际上已成为一个指针变量,此句把m的地址送到寄存器EDX中
004017C6 mov eax,dword ptr [edx] //寄存器间址寻址方式把EDX指向的地址(变量m)处的值(300、0x12c)送到EAX中
004017C8 push eax //数据300入栈供cout显示
004017C9 mov ecx,offset std::cout (00477a10)
004017CE call @ILT+255(std::basic_ostream<char,std::char_traits<char> >::operator<<) (00401104)
004017D3 mov ecx,eax
004017D5 call @ILT+480(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004011e5)
11: cout << m << endl;
004017DA push offset @ILT+200(std::endl) (004010cd)
004017DF push 0C8h //直接把数据200(0xc8)入栈供cout显示,可以看到显示m的值,编译器好像#define m 80一样宏定义替代了
004017E4 mov ecx,offset std::cout (00477a10)
004017E9 call @ILT+255(std::basic_ostream<char,std::char_traits<char> >::operator<<) (00401104)
004017EE mov ecx,eax
004017F0 call @ILT+480(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004011e5)