《C与指针》读书笔记
第六章
6.1. 内存和地址
获得一个值的地址,就能根据这个地址获得这个值,但如果编程时直接使用地址访问值,是非常繁琐的,所以高级语言使用名字而非地址访问内存的位置,这些名字就是我们编程者所使用的变量。变量名和内存位置之间的关联是编译器提供的,为编程者所使用。而电脑硬件依旧使用地址访问内存位置。
6.4. 间接访问操作符
通过指针访问他所指向的内存地址称为“间接访问”或“解引用指针”,用于进行间接访问的操作符是单目运算符*。
比如指针p的值是100,即它储存的地址(指向的地址)是100,对p使用间接访问操作符*时,就是访问内存地址100并察看那里存放的值。如果内存100存放的值是112,那么*p 就等于112.
6.6. NULL指针
NULL指针作为一个特殊的指针变量,表示不指向任何东西。注意NULL是一个指针变量而不是一个值。要使得一个指针成为NULL指针,可以赋值以0.
对指针进行解引用操作(即“*”)可以获得他所指向的值,但NULL指针并不指向任何东西,因此对NULL进行解引用操作是非法的(但机器未必会做出提醒),在对指针进行解引用操作时必须判断它是否为NULL指针。
6.8. 指针、间接访问和变量
&a是变量a的地址,是一个指针常量。对于指令*&a = 25,先通过&获得a的地址,再对a的地址进行解引用操作,并赋值25,实际上等效于a = 25.
6.9. 指针常量
假设变量a的地址是100,那么语句*100 = 25的功能是什么?把25赋值给a?
这是错误的!这条语句实际上是非法的,因为编译器会把“100”看做是一个普通的整型数值而非一个地址!而间接访问操作符*只能用于指针类型表达式身上。如果确实像把25存储到地址100中(实际上是储存到以地址100为开端的一片内存区域中,这片内存区域的大小视乎“25”所属的数值类型,比如25为int型的话,就是4),就要进行强制类型转换。以下指令是合法的。
*(int*)100 = 25;
上述语句将100由“整型”转为“指向整型的指针”,这样对它进行间接访问就是合法的了。
>>未完