详细研究自己看操作系统原理。
一个变量有两部分组成,在内存里分成程序编码部分和运行部分,就是堆和栈。
简单点说就是系统加载exe后,把exe所有编码转换成机器码存放在内存里,这部分就是变量名,它有一个名字,或者说一个标签指向另外一个地址。(exe转换成机器码后是不会改变的,改变的是内容部分的区域)
而变量内容部分在另一个内存区域,它和名字是分开的。比如你定义一个结构或者数组,他们之间的内容部分是连在一起的,而不是中间夹杂名字。
当你重新改变某个变量的时候,操作系统会查询变量名字,然后再转到内容区域去修改。
这样一来,指针是可以修改的,它可以改变指向的地址,但在exe机器编码内部它的名字叫p,写程序的时候当然是呼叫p,当下面有呼叫p的时候系统肯定是先查询有没有p这个名字,然后才去查询它的值,发现是指针不是变量,然后按照指针方式处理,然后巴拉巴拉巴拉。。。。。。
嗯。。。为什么系统要把执行代码和内容代码分开来放?实际上解决一个很简单的问题,就是动态内存,每个系统都可以设置内存增长大小(一般是4k,设置过小消耗cpu,过大浪费内存,比如一次new一个char但增加了16k内存)
详情还是自己看操作系统原理的书