指针:
内存bit模型:由于 1 个 bit 只能表示两个状态,所以大佬们规定 8个 bit 为一组,命名为 byte。
内存byte模型:给内存中每个 byte 唯一的编号,所有编号连起来就叫做内存的地址空间,这和大家平时常说的电脑是 32 位还是 64 位有关,现在的计算机一般都是 32 位起步了,32 位意味着可寻址的内存范围是 2^32 byte = 4GB。
我们都知道 int 类型占 4 个字节byte,并且在计算机中数字都是用补码(不了解补码的记得去百度)表示的。而 float、char 等类型实际上也是一样的,都需要先转换为补码。对于多字节的变量类型,还需要按照大端或者小端的格式,依次将字节写入到内存单元。记住上面这两张图,这就是编程语言中所有变量的在内存中的样子,不管是 int、char、指针、数组、结构体、对象… 都是这样放在内存的。
获取地址:运算符&来取得变量实际的地址,这个值就是变量所占内存块的起始地址。可以通过&取地址符号,将 a 的地址传递进去。
表示地址:通过int * 去定义一个指针变量,会非常明确:这就是另外一个 int 型变量的地址。
解地址:通过地址去获取a的值,这个操作就叫做解引用,在 C 语言中通过运算符 *就可以拿到一个指针所指地址的内容了。
别看这个地方很简单,但却是深刻理解指针的关键。
举个例子来详细说明:
比如:float f = 1.0;
short c = (short)&f;
你能解释清楚上面过程,对于 f 变量,在内存层面发生了什么变化吗?或者 c 的值是多少?1 ?
实际上,从内存层面来说,f 什么都没变。
详细过程如下:
&f取得f 的首地址
(short*)&f
上面第二步什么都没做,这个表达式只是说 :
“噢,我认为f这个地址放的是一个 short 类型的变量”
最后当去解引用的时候*(short*)&f时,编译器会取出前面两个字节,并且按照 short 的编码方式去解释,并将解释出的值赋给 c 变量。