指针加减法运算的“定义域”
指针变量加(减)一个整数。 例如:p++,p--,p+i,p-i,p+=i,p-=i等均是指针变量加(减)一个整数。 将该指针变量的原值(是一个地址)和它指向的变量所占用的存储单元的字节数相加(减)。 ————谭浩强 ,《C程序设计》(第四版),清华大学出版社,2010年6月,p290 在C语言中,任何运算都有前提条件。脱离了前提谈运算是荒谬的。 比如,一元“*”运算,其运算对象必须是非void *类型的指针。如果对一个int类型的数据或unsigned类型的数据做一元“*”运算,连编译都无法通过(这也间接说明了指针并非是一个32位无符号整数。参见§246)。 再比如,两个int类型数据相加,其前提条件是结果必须在int类型可以表示的范围之内,否则就成了一种未定义行为(undefined behavior)。 指针运算也是如此。并非所有的指针类型数据都有加(减)法运算。C语言并没有定义void *类型指针或指向函数的指针的加减法运算。换言之,指针的加减法运算只对那些指向数据对象(Object)类型的指针才可能有意义。比如:int *类型的指针可以做加减法运算。 指向数据对象类型的指针的加减法运算并没有限制运算对象是左值(lvalue)或可修改的左值(modifiable lvalue),用一句通俗的话来说