看一遍就懂的内存变量和指针

8 阅读3分钟
一个内存条比作一栋楼的一个单元,多个单元想象成多个内存条,多个内存条组成整个计算机的总内存。
我们拿一个内存条来解释内存,其他内存条也是同样结构。一个内存条好比这栋楼一个单元,如下

老式计算机一个内存单元存1个字节(计算机存储的最小单位),现代计算机内存单元存4个字节 我们以 老式计算机 为例子:

我们刚才把一个内存条比作一个单元楼,每个单元里面比如有10个房间,想象成每层一个房间, 那么这个房间 是什么?如图:

44444.jpeg

假设房间有200平的,100平的,50平的,所以我们把房间想象成一个 int类型 或者 char类型的 变量,如图用嘴底下 int a = 100, 那么 a 表示什么呢, 可以想象成a表示张三的家, int b = 20, b表示李四的家, 所以变量a是一个标签,这个标签的类型就是分配的200平 还是100平 决定的, 当我们说张三的家 就代表变量 a 间接代表 a里面的值100,比如这个值就是张三本人。 我们在来理解这个房间(家),因为房间代表类型int所以他不是内存单元,内存单元是什么,是房间里面的的一个屋子,我们可以理解为如图:200平的房子表示int类型 张三的家(a) = 100(张三) , 家里面有4间屋子,想象成张三属于200斤重这种类型的人就必须住200平的房子, 这种房间(家)里面就是4间屋子,那么每个屋子就是一个内存单元,也就是一个字节, 想象成张三的家有4层也代表4个屋子,那么每一层有一个编号,最底下的001,依次 002 003 004 ,所以 a表示张三的家 的首地址就是001,在指针中 &a 也就是 取a的地址,也就是首地址,所以我们写程序时候int a = 100 是给这单元楼分配一个张三的家a 存储张三这个人(100值)的空间(家),张三这个人因为200斤重 所以把分配的是 4个内存单元(屋子)组成的200平的房间(家)。这个房间(家)的首地址就是第一个屋子的地址001, &a可以取到这个地址。

 指针:int a = 100, int* p, p = &a  可以把 int* 写到一起,说明声明的是int类型的指针变量 p   ,int不加* 说明变量是int类型 比如 前面的a , 如果 int* 说明声明的是一个int类型的指针变量,这个指针变量存储的一定是地址,可以说p的值是一个 地址     这个地址 就是 &a的地址 001,  那么既然是指针变量了,所以他存储的也一定是指针,所以根据前面所述,指针就是地址  。  *p 就代表 取P这个地址中的值 也等同于 *(&a) 也就是 P是取地址,*p就是取值 
 变量和指针类比:JavaScript语言中 var a = 100 , b = 10.1 我可以理解为 普通变量a 可以有 int float 类型,所以在C++或者有类型的语言中我们 这样写 int a = 100, float b = 10.1 引申到指针我们可以这样理解, 指针变量p 可以有 int* 类型,float* 类型,所以 int* p = &a, float* p = &b
 那么啥时候用P 啥时候用*p 呢????????????? 关注我后面详细述。