从内存与汇编的角度理解C语言指针第01篇:p、*p、&p的区别

一、C程序

现有C程序如下:

int main(void) {
    int a = 1;      // 定义变量a,值为1
    int *p = &a;    // 定义指针p,指向a
    return 0;
}

二、对应的汇编代码

以上C程序中的第2行、第3行对应的汇编代码如下(每行右边有参考注释):

mov    DWORD PTR [rbp-0xc],0x1     ; 把数字1存放到内存单元[rbx-0xc]处,占4个字节
lea    rax,[rbp-0xc]               ; 内存单元[rbx-0xc]的地址存入rax寄存器
mov    QWORD PTR [rbp-0x8],rax     ; 把rax寄存器中的值存放到内存单元[rbp-0x8]处,占8个字节

C程序中的 int a = 1; 对应汇编代码中的第1行。
C程序中的 int *p = &a; 对应汇编代码中的第2、第3行。

三、内存布局

内存布局如下:

变量变量地址内存地址内存值
p&p0x61fe180x61fe14
a&a0x61fe140x01

四、p*p&p的区别

p*p&p的值如下:
在这里插入图片描述
说明:
p是指向变量a的指针。
p的值是变量a的地址。

*p的作用是访问指针所指向的对象(这是一个动作),即访问变量a
*p的值是指针所指向的对象的值(这是动作的结果),即变量a的值,也就是1。

&p的作用是获取指针p的地址(这是一个动作)。指针是一种特殊的变量,因此也可以说&p的作用是获取变量p的地址。
&p的值是指针变量p的地址(这是动作的结果)。

五、指针的定义

按照《C程序设计语言(K&R)第2版》书中的定义:“指针是能够存放一个地址的一组存储单元”。这个定义其实就是从内存的角度出发的。
对应于本例中,指针p就是下图红框中的那8个字节的存储单元,8个存储单元的起始地址是00x000000000061fe18(简写0x61fe18),存储单元中存储的内容是0x000000000061fe14(简写0x61fe14),即变量a的地址。
在这里插入图片描述

六、个人记忆方法

以下为我个人的记忆方法,供参考。
a:变量。或:所指变量。
p:指针变量。或:所指变量的地址。
*p:所指变量的值。
&p:指针变量本身的地址。

强调一下,谈到指针时,脑海里就要反应过来它存放的值是另一个变量的地址:指针就是地址,指针就是地址,指针就是地址。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值