目录
1:内存和地址
1.1内存
以生活举例子:内存如同一栋学生宿舍,每个宿舍都有独一无二的门牌号, 有了门牌号,可以快速找到宿舍。
1. 一楼 101 102 103 104 105 106 107……
2. 二楼 201 202 203 204 205 206 207……
3. ……
如果把上面的例子对照到计算中,又是怎么样呢?
我们知道计算机上CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数据也会放回内存中。那我们买电脑的时候,电脑上内存是8GB/16GB/32GB等,那这些内存空间如何高效的管理呢?
其实也是把内存划分为⼀个个的内存单元,每个内存单元的大小取1个字节。
计算机中常见的单位(补充):⼀个比特位(bite)可以存储⼀个2进制的位1或者0
每个内存单元,相当于⼀个学生宿舍,⼀ 个字节空间里面能放8个比特位,就好比同学们住的八人间,每个人是⼀个比特位。 每个内存单元也都有⼀个编号(这个编号就相当于宿舍房间的门牌号),有了这个内存单元的编号,CPU就可以快速找到⼀个内存空间。 生活中我们把门牌号也叫地址,在计算机中我们把内存单元的编号也称为地址。C语⾔中给地址起了新的名字叫:指针。 所以我们可以理解为: 内存单元的编号 == 地址 == 指针
1.2地址
计算机内存编址基础概念
- 为什么需要编址:
- 计算机的内存中存储着大量数据,为了准确地访问或修改这些数据,我们需要给它们一个唯一的地址标识。
- 硬件层面的编址:
- 内存的编址不是通过软件记录每个字节的地址,而是在计算机硬件设计时就确定好的。
- 类似于乐器上弦的位置,不需要标记,演奏者就知道如何找到正确的音符,这是因为设计和共识。
- 协同工作的硬件:
- 计算机中的不同硬件部分(如CPU和内存)需要协同工作,它们之间通过物理线路连接。
- 这些线路允许硬件之间传递数据和指令。
- CPU与内存的连接:
- CPU通过一组特殊的线路——地址总线,向内存发送要访问的数据的地址。
- 地址总线就像是一条条传输地址信息的“道路”。
- 地址总线的原理:
- 每条地址总线可以表示0或1两种状态,多条地址总线组合起来就可以表示非常多的不同地址。
- 例如,32条地址总线可以同时工作来表示2的32次方(即超过40亿)个不同的内存地址。
- 数据访问的步骤:
- CPU使用地址总线告诉内存它想要访问哪个地址的数据。
- 内存查找该地址,并将找到的数据通过另一条线路——数据总线,发送回CPU。
- CPU接收到数据后,可以在其内部的寄存器中进行处理或存储。
2:指针变量和地址
2.1取地址操作符( & )
通过上面对内存和地址的理解,我相信你已经懂了,那么我们回归到c语言中,在c语言中创建变量就是向内存申请一块地址空间。
代码中整型变量a向内存申请了4个字节 ,用于存放整数10,其中每个字节都有属于自己独一无二的地址
按照我画图的例⼦,会打印处理:0X000029F6 &a取出的是a所占4个字节中地址较小的字节的地 址。
虽然整型变量占用4个字节,我们只要知道了第⼀个字节地址,顺藤摸瓜访问到4个字节的数据也是可行的。
2.2指针变量和解引用操作符( * )
2.2.1指针变量
那我们通过取地址操作符(&)拿到的地址是⼀个数值,比如:0x000029F6,这个数值有时候也是需要存储起来,方便后期再使用的,那我们把这样的地址值存放在哪里呢?答案是:指针变量中。 比如:
指针变量也是一种变量,这种变量用来存放地址的,存放在指针变量中的值都会被理解为地址
2.2.2如何拆解指针类型
我们可以看到上面的 pa 的类型是 int * ,下面通过图片来描述 指针的 类型
这⾥ pa 左边写的是 int * , * 是在说明 pa 是指针变量,而前面的 int 是在说明 pa 指向的是整型(int) 类型的对象。
以此类推 char 类型的对象用 char * 指针变量来存放 float 类型的对象 用 float * 指针变量来存放
2.2.3解引用操作符
- 在C语言中,指针是存储变量内存地址的变量。
- 通过指针,我们可以间接访问和操作内存中的变量。
- 为了读取或修改指针指向的值,我们使用解引用操作符(
* )
。 - 这样,只要我们知道变量的地址(即指针),就可以使用解引用操作符来访问或修改该变量的值。
- 上面代码中第47行就使用了解引用操作符, *pa 的意思就是通过 pa 中存放的地址,找到指向的空间, * pa其实就是a变量了;
- 所以* pa = 0,这个操作符是把 a 改成了 0 。
- 你们肯定在想,这里如果目的就是把a改成0的话,写成 a = 0; 不就完了,为啥非要使用指针呢?
- 其实这里是把 a 的修改交给了 pa 来操作,这样对 a 的修改,就多了⼀种的途径,写代码就会更加灵活。
2.3指针变量的大小
总结:
- 32位平台下地址是32个bit位,指针变量大小是4个字节
- 64位平台下地址是64个bit位,指针变量大小是8个字节
- 注意指针变量的大小和类型是无关的,只要指针类型的变量,在相同的平台下,大小都是相同的。