从汇编看c语言指针(持续更新)

很多人在学习c语言的时候对指针的使用不太理解,我也一样,因此这篇文章主要总结我自己踩过的坑以及帮助没学过汇编的同学从汇编视角理解指针,我一直觉得只有从汇编视角看指针才是理解指针的最好方式。知识点1:内存地址内存是按字节编制的。32位即有2^32个寻址空间,每个地址空间含一个字节,最后也就是4GB大小。假设地址是在3位位模式(地址总线3根)下,地址即为000,001,010,011,100,101,110,111(只是例子,实际内存地址是16进制)。总共8个组合,也就是8个地址。每个地址上的字节是用两个1
摘要由CSDN通过智能技术生成

指针在c中是个非常重要的概念,很多人在学习c语言的时候对指针的使用不太理解,我也一样,因此这篇文章主要总结我自己踩过的坑以及帮助初学c的同学从汇编视角理解指针。

知识点1:内存地址

内存是按字节编址的。32位即有2^32个寻址空间,每个地址空间含一个字节,最后也就是4GB大小。假设物理地址是8字节(地址总线3根)下,地址即为000,001,010,011,100,101,110,111(只是例子,实际内存地址是16进制)。总共8个组合,也就是8个地址。每个地址上的字节是用两个16进制表示的,整好8位1个字节大小。在这种情况下,一个指针变量的大小是3位,2的3次方正好就是那八个地址。因此在64位模式下,任何类型指针的大小都是64位8字节(此时的内存地址是虚拟内存地址,讨论c语言指针并不关注虚拟地址到实地址的转换)。

知识点2:大端小端

我们知道,在不同国家姓和名的顺序是不同的,比如在中国你叫张三,那在欧美国家人们往往称呼你为“三 张”。类似的案例出现在计算机中。小端序的意思即为低地址存放低位数据(以字节为单位,假设左边是低地址,4567小端方式是67 45而不是76 54)。
在计算机中有大端小端两种存放数据的方式,以小端序为例,假设我们要在0000这个地址上存放一个short类型变量,变量值为4660(16进制表示为1234),然后我们要把这个变量存储在0000这个位置,那么接下来会怎么做呢?答:往上“爬格子”,从0000开始爬,0000将会存储34,而一个short需要两个地址也就是16位,还需要再往上爬一个地址,所以0001存储12。在计算机中呈现出来就是 34 12,这个变量的起始地址就是0000。如果此时我们取short的地址,这个地址就是0000,将其赋给一个short型指针,这个指针就指向0000。在解引用读取的时候编译器会根据指针变量的类型自动帮你爬格子,比如short就爬两格,int爬四格(这也是导致了很多问题,比如指针强制转换后解引用造成的读越界,c语言中缺乏这样的保护机制)…

知识点3:副本

在函数main中调用另一个函数foo,b会在main中变成20吗?

int main()
{
   
	int b = 10;
	foo(b
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值