|
#include <iostream>
using namespace std;
int a = 5;
int main() { int* ap = (int*)4681152; *ap = 8; cout<<(int)&a<<endl; cout<<a<<endl; return 0; }
|
输出结果为:4681152和8,也就是说a的被指针ap改变了。
其实4681152正是变量a的内存地址,和指针ap的指针值相同。这样指针ap就改变变量a的值。
注:该程序不可移植,运行结果不可重复。因为a的内存地址可能改变,这样就得调整。
值得一提的是,赋给ap的内存值在[4681152-3, 4681152+3]都将影响变量a的值。
例如,将4681152改成4681153,这时a的值变成了2053,化成十六进制为0805H。原因如下:
内存中的数值是按照高位存储在高地址,地位存储在低地址,比如将12345678H存储到内存中,变为78563412H(注意是按字节为单位的)。因此int a = 5;将在内存中存储为05000000H(内存地址从4681152至4681156),在调用int* ap = (int*)4681153;*ap = 8;后从4681153至4681157的内存地址存储的值变成08000000H。至此内存地址从4681152至4681156存储的内容变成了05080000H,也就是我们认为的00000805H,即十进制中的2053。