汇编之后征服C___指针和值
热度 130已有 475 次阅读2012-3-23 14:22
若定义int * p;
有些人就说p是一个指针,那是因为他还不了解数据在内存的存储形式
其实p是一块内存,这块内存里面保存的值才是一个指针
那么p在内存中的形式究竟是如何存在的呢?
#include <stdio.h>
int main()
{
int * p;
int q = 5;
p = &q;
printf("p=0x%p &p=%p &q=0x%p",p,&p,&q);
}
结果输出:p=0x0012FF78 &p=0012FF74 &q=0x0012FF78
补充只是:由于局部变量保存在栈里面的,以上结果是使用_cdecl的调用方式,并且是Realese版
下面我们看汇编之后的代码
push 5 // q = 5
lea eax,[sp] // 从这里到
push eax //这里的操作就是 p = &q
由于这两个数据压入栈后的形式是这样的
++++++++
p=&p; 也就是说
——————
q=5
——————
对着输出结果:p=0x0012FF78 &p=0012FF74 &q=0x0012FF78
我们可以发现,p,&p,&q都是地址,这也从侧面说面p是一块内存,地址为0x0012FF74
那我们可以这样理解,
p 和 q 其实都是指一块内存,
而p这块内存保存的是一个地址,这个地址的值等于q这块内存的地址,也就是我们通常所说的指向q这块内存
而q这块内存保存的是一个值,也就是5