要了解指针是什么,首先要了解数据是如何存储在内存中,以及如何读取的。如果在程序中定义了一个变量,那么在编译程序时,系统会为这个变量分配一个内存单元。编译系统会从程序中定义的变量类型中分配一定长度的空间。
内存的基本单位是字节,一个字节有8位。每个字节都有一个数字,这个数字就是“地址”,相当于一个酒店房间号。地址所指示的存储单元中存储的数据相当于住在酒店房间的乘客。
我们一定要明白“内存单元的地址”和“内存单元的内容”这两个概念的区别,也就是“房间号”和“房间里的住户”的区别。在程序中,一般会通过变量名访问内存单元。实际上,程序编译完成后,变量名已经转化为变量的地址,通过地址进行对变量值的访问。这种通过地址访问变量的方式称为直接访问。
还有一种间接访问方式,就是将另一个变量的地址存储在一个变量中。也就是说,变量中存储的不是数据,而是数据的地址。就像寻宝一样,也许你辛辛苦苦找到的宝藏不是金银首饰,而是另一张藏宝图。根据C语言的规定,可以在程序中定义整型变量、实型变量、字符型变量,还可以定义这样一个特殊的变量,存放地址。
由于能通过地址找到所需的变量单元,也就可以说地址“指向”了变量单元。就像房间号指向房间一样,只要告诉房间号就可以找到房间的位置。因此,在C语言中,地址被形象地称为“指针”,意思是它可以找到地址所在的内存单元。
因此,变量的那个地址被称为指向该变量的指针。指针就是地址,地址是内存单元里的编号。它是一个从零开始的、受操作限制的非负整数。
为什么限制操作?因为非负整数和非负整数可以进行加减乘除,但是指针和指针只能进行减法运算,不能进行其他运算,因为它没有意义。并且减法运算也是有条件的:只能减去同一空间中的地址。而两个指针变量相减结果只是一个常量,不是指针变量,也就是说,相减的结果是两个地址之间的元素个数,而不是地址个数。
内存中的一个单元是指一个字节,一个字节有8位。每条地址总线有两种状态:0和1。两条地址总线有4种组合,可以控制4个内存单元;三种地址总线的8种组合,可控制8个内存单元;n个地址总线有2n个组合,可以控制2n个内存单元。
那么CPU一共通过几条地址总线来处理内存呢?一般计算机是32位的,也就是32条地址总线,那么它可以控制232个内存单元,也就是232字节。232B=4GB,所以32位电脑只能控制4GB内存。这就是为什么我说 RAM 没有硬盘那么大。
领取专属 10元无门槛券
私享最新 技术干货