ANSI C的一个最重要的变化时,它明确地制定了操纵指针的规则。事实上,这些规则已经被很多优秀的程序设计人员和编译器所采纳。此外,ANSI C使用类型void* (指向void的指针)代替char * 作为通用指针类型。
把c的地址赋给变量p,我们称p为“指向”c的指针。地址运算符&只能应用于内存中存在的对象,即变量和数组元素。它不能作用于表达式、常量或register类型的变量。
C语言保证,0永远不是有效的数据地址。因此,返回值0可以用来表示发生了异常事件。指针和整数之间不能相互转换,但0是唯一的例外:常量0可以赋值给指针,指针也可以和常量0进行比较。程序中经常用符号常量NULL代替常量0,这样便于更清晰地说明常量0是指针的一个特殊值。符号常量NULL定义在标准头文件<stddef.h>中。
指针的运算:
首先,在某些情况下对指针可以进行比较运算。例如,如果指针p和q指向同一个数组的成员,那么他们之间就可以进行类似于==、!=、<、>=的关系比较运算。如果p指向的数组元素的位置在q指向的数组元素位置之前,那么p<q的值为真。任何指针与0进行相等或不等的比较运算都有意义。但是,指向不同数组的元素的指针之间的算术或比较运算没有定义。(这里有一个特例:指针的算术运算中可使用数组最后一个元素的下一个元素地址。)
其次,我们可以看到指针可以和整数进行相加或相减运算。例如,结构p+n 表示指针p当前指向的对象之后第n个对象的地址。无论指针p指向的对象是何种类型,上述结论都成立。在计算p+n时,n将根据p指向的对象的长度按比例缩放,而p指向的对象的长度则取决于p的声明。