鱼C论坛

 找回密码
 立即注册

汇编之后征服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






1

路过

鸡蛋
4

鲜花
6

握手

雷人

刚表态过的朋友 (11 人)

全部作者的其他最新日志

发表评论 评论 (10 个评论)

回复 郑涛 2012-3-24 10:52
   ,不错,我了然了!!谢谢斑竹啊
回复 心静如死水 2012-4-2 13:29
没接触到,不过还是感觉很详细
回复 875790988 2012-4-15 11:55
斑竹把这篇日志的字体颜色改一下嘛   字体的颜色和背景颜色一样了
回复 越野e族 2012-5-1 15:26
看不到的。。
回复 越野e族 2012-5-1 15:57
不知道*(&p)的结果是什么,按道理说应该是:q内存的地址?
再(*(8(&p)))应该等于5
回复 乘风追日 2012-5-15 14:28
此所谓无字天书么?哈哈!看了别人的而回复才知道咋回事!
回复 qwer756071572 2012-5-18 13:31
aaaaaaaaaaaaaaaaaaaaaaaaaaaaa
回复 上善若水··· 2012-5-26 12:20
     怎么看不到呀`
回复 肖凯文kevin 2012-6-19 10:57
为什么看不到呢~~~???
回复 wAterLoo 2012-6-19 19:26
肖凯文kevin: 为什么看不到呢~~~???
Ctr + A

facelist

您需要登录后才可以评论 登录 | 立即注册

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-12 00:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

返回顶部