摘抄于:《C和指针》
指针常量
让我们来分析另外一个表达式。假定变量a存储于位置100,下面这条语句的作用是什么?
<center> *100 = 25;
看上去像是把25赋值给a,因为a是位置100所存储的变量。但是,这是错的!这条语句实际上是非法的,因为字面值100的类型是整型,而间接访问操作只能作用于指针类型表达式。如果你确实想把25存储于位置100,你必须使用强制类型转换。
*(int *)100 = 25;
强制类型转换把值100从“整型”转换为“指向整型的指针”,这样对它进行间接访问就是合法的。如果a存储于位置100,那么这条语句就把值25存储于a。但是,你需要使用这种技巧的机会是绝无仅有的!为什么?我前面提到过,你通常无法预测编译器会把某个特定的变量放在内存中的什么位置,所以你无法预先知道它的地址。用&操作符得到变量的地址是很容易的,但表达式在程序执行时才会进行求值,此时已经来不及把它的结果作用字面值常量复制到源代码。
这个技巧唯一有用之处是你偶尔需要通过地址访问内存中某个特定的位置,它并不是用于访问某个变量,而是访问硬件本身。例如,操作系统需要与输入输出设备控制器通信,启动1/O操作并从前面的操作中获得结果。在有些机器上,与设备控制器的通信是通过在某个特定内存地址读取和写入值来实现的。但是,与其说这些操作访问的是内存,还不如说它们访问的是设各控制器接口这样,这些位置必须通过它们的地址来访问,此时这些地址是预先已知的。
第3章曾提到并没有一种内建的记法用于书写指针常量。在那些极其罕见的需要使用它们的时候,它们通常写成整型字面值的形式,并通过强制类型转换转换成适当的类型。