来聊聊内存中变量和指针以及引用的关系

简介: 来聊聊内存中变量和指针以及引用的关系

内存的本质

内存的存储结构

内存存储结构本质上就好比我们日常生活中的储物柜,它是由无数个存储单元构成,而存储单元存储的元素只能是0或者1,也就是我们常说的二进制。

基于bit存储数据

仅仅用几个0或者1很难抽象现实生活中的各种数据,假如我们将8个存储单元看作一个整体,8个存储单元组成的二进制数组就有256个变化,这样一来就可以表示大部分数据了。

而8个存储单元即8bit,也就是我们常说的一个字节,用数学的方式来表示就是:

1 byte=8 bit

基于字节得到地址

尽管用字节增加了可变的范围,但是面对下面这些情况我们数据表示还是很无力:

  1. 1000本图书的编号。
  2. 电话号码
  3. 更大的整数。

所以我们需要用更多的存储单元来表示,因为上面有了字节这个单元,我们不妨将字节对应的存储单元看作整体,用多个字节组成更大的单位。例如我们就用4个字节表示整型int,32bit即可表示4294967296种组合变化,可表示的数据范围一下就增多了。

同样的道理,我们也可以用更多的字节组成更多的类型,例如double、long类型等。

变量

有个存储单元我们就能存储数据了,假如我们把自己看作是内存,该内存只有8个字节,如下图所示:

我们希望在地址6,也就是倒数第二个位置写入1,对应的CPU操作指令如下,可以看到数值1前面我们加个了$符号,用于表示数值,而不加符号的6则表示地址6。

# 将1这个值写入地址6位置
store $1 6

同理对应的读取一个字节的指令则是

load r1 6

如果为了操作变量而每次都去记录和操作地址就很不方便了,高级语言为了屏蔽这一点就用到了变量,例如:将上面的地址6用a来表示。

于是,后续我们要操作地址6的字节时,例如将地址6的值设置为2,我们只需用:

a=2

可以看到通过高级语言,我们只需对变量赋值即可完成底层各种操作地址的读写指令

指针

引用

参考文献

计算机底层的秘密:https://book.douban.com/subject/36370606/


目录
相关文章
|
25天前
|
存储 Java C++
C++ 引用和指针:内存地址、创建方法及应用解析
C++中的引用是现有变量的别名,创建时需用`&`运算符,如`string &meal = food;`。指针存储变量的内存地址,使用`*`创建,如`string* ptr = &food;`。引用必须初始化且不可为空,而指针可初始化为空。引用在函数参数传递和提高效率时有用,指针适用于动态内存分配和复杂数据结构操作。选择使用取决于具体需求。
38 9
|
1月前
|
存储 Go iOS开发
掌握Go语言:探索Go语言指针,解锁高效内存操作与动态数据结构的奥秘(19)
掌握Go语言:探索Go语言指针,解锁高效内存操作与动态数据结构的奥秘(19)
|
2月前
|
存储 安全 C语言
引用指针
引用指针
15 1
|
2月前
|
存储 安全 C++
在C++指针和引用
在C++指针和引用
|
2月前
|
存储 算法 C语言
通过指针引用数组元素
通过指针引用数组元素
21 0
|
2月前
|
存储 算法 C语言
通过指针引用多维数组
通过指针引用多维数组
11 0
|
2月前
|
存储 安全 C++
CPP的指针和引用
CPP的指针和引用
16 0
C4.
|
2月前
|
存储 程序员 C语言
C语言中如何通过指针引用字符串
C语言中如何通过指针引用字符串
C4.
17 0
C4.
|
2月前
|
算法 安全 程序员
C语言中如何通过指针引用数组
C语言中如何通过指针引用数组
C4.
24 0
|
2月前
|
安全 程序员 C++
C++中的智能指针:从原始指针到现代内存管理
C++中的智能指针:从原始指针到现代内存管理
18 0