1. 首先先得了解一下内存。内存是用来存储数据的,内存里面分为三个部分:栈区,堆区和静态区。
堆区先知道有这么一回事就ok了,主要是动态内存分配,如malloc,calloc,free,realloc,目前也不懂就了解一下,栈区里面放局部变量,函数参数等等,反正都是临时的变量,都是进入作用域创建,出了作用域就销毁/释放。静态区里面放全局变量与静态变量。放在静态区的数据创建后直到程序结束后才会释放。
2. 内存是计算机上的一种存储介质,存储空间,比如内存有4G,6G,8G,内存用处:程序运行的时候会载入到内存,程序中如果有数据需要存储,也会开辟/申请一个内存空间用来存储数据。
3.那么还如何有效使用与管理内存呢?先想象一个一个场景:比如说有一栋楼,这栋楼有一个个房间,每个房间都有自己的编号。而事实上计算机内存也差不多,计算机将内存划分为一个个小的内存单元,同时对其进行编号,这样子就能有效管理内存。在空间划分实践中,一个内存单元的大小为1字节,每个内存单元都有编号(内存编号),内存编号也可以称为地址,在C语言中地址也称为指针。 内存编号=内存单元的地址=指针
尤其注意:一个字节是八个比特,相当于八个二进制位,也就是说是两个十六进制位
4.如果要访问一个内存单元,那么得依托内存编号,那内存编号/内存单元的地址/指针是如何产生的呢?也就是说到底是怎么样来命名这个内存单元编号/地址/指针呢?
5.以32位机器为例(电脑有32与64位之分),这个物理机器有32根地址线,如果电脑的地址线通电,就会有电信号(高电频或者低电频),这些电信号会转化为数字信号(0/1),因此:一根地址线-----一个电流信号-----一个数字信号(0或1),32根地址线合在一起就会有32比特位的二进制序列,这样子的话电信号转化为数字信号有2^32种二进制序列,定义一个二进制序列为一个内存单元的编号/地址/指针,因此这样下来总共有2^32个地址,就可以管理2^32个内存单元=2^32个字节的内存空间=4GB的内存空间。
一些小注意点
1.%p是专门用来打印地址的
2.%zd是专门打印sizeof()的返回值的,sizeof返回的单位是字节,返回的是变量所占内存(单元)的大小。