C指针学习记录

开篇小小的BS下自己,以前对知识的理解是多么浮浅!
指针首先是一个变量,同"传统"意义上的变量不同,后者往往保存的是一个值,而指针保存的是一个 有具体值的变量内存地址. 参考如下代码:


  1. int * p;
  2. int a = 2;
  3. p = &a;
这里关于 int * p有两种理解:1.*p是一个int 类型的变量 2.p是一个int *(指向整数类型)的指针.这两种都是正确的,事实上结合起来看或许更好.我们所说的指针实际上是p,而非*p!
"*"和后面"&"一样都是指针操作符之一,他们的关系恰恰是互补的,对一个变量x我们有如下规则:
&*x = *&x(把*和&按照任意顺序排列,得到的值是一样的)
"*"是针对指针的操作符,它返回指针所指向的数据类型的值.
"&"是针对内存中数据类型的操作符,他返回该数据类型的内存地址,并建立一个指向该变量的指针.
在C中,也可以把指针理解成为地址(address).p = &a就是把变量a的内存地址赋值给p,同时建立指向a的指针p.
实际上在汇编代码中,我们可以更加清晰的看到这点:

movl $2, -8(%ebp) //get a;
leal -8(%ebp), %eax //get &a;
movl %eax, 4(%ebp) //get p;

这里的%eax是寄存器,而-8(%ebp)则是实际上的存储器寻址.观察第二行,我们发现leaf取地址预算把M(R(%ebp)-8)的内存地址R(%ebp)-8传给了寄存器%eax.而后,寄存器%eax又将值储存到p中,即p中实际保存的是a的内存地址(p=&a)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值