指针加上一个整数的结果是另一个指针。问题是:它指向哪里?
如果将一个字符指针加1,运算结果产生的指针指向内存中的下一个字符。
float占据的内存空间不止1个字节,如果将一个指向float的指针加1,将会发生什么?
它会不会指向该float值内部的某个字节呢?
幸运的是,答案是否定的。当一个指针和一个整数量执行算法运算时,整数在执行加法运算之前始终会根据合适的大小进行调整。这个“合适的大小”就是指针所指向类型的大小,“调整”就是把整数值和“合适的大小”相乘。例如:某台机器上,float占4个字节。在运算float型指针加3的表达式时,这个3将根据float类型的大小(此例中为4)进行调整(相乘)。这样实际加到指针上的整数值为12。
把3与指针相加使指针的值增加3个float的大小,而不是3个字节。
指针运算分为算术运算和关系运算。
算术运算只限于两个形式。
第1种形式是:
指针 ± 整数
标准定义这种形式只能用于指向数组中某个元素的指针。
这类表达式的结果类型也是指针。
数组中的元素存储于连续的内存位置中,后面元素的地址大于前面元素的地址。,因此,对一个指针加1使它指向数组中下一个元素,加5使它向右移动5个元素的位置,以此类推。把一个指针减去3使它向左移动3个元素的位置。
要注意的是,如果进行完加法或者减法运算后,指针指向的位置不在数组的范围内,则发生了数组越界。对这个指针执行间接访问,即解引用操作可能会失败。
第2种形式是:
指针 - 指针
只有当两个指针都指向同一个数组中的元素时,才允许从一个指针减去另一个指针。
两个指针相减的结果的类型是ptrdiff_t,它是一种有符号的整数类型。减法运算的值是两个指针在内存中的距离(以数组元素的长度为单位,而不是以字节为单位),因为减法运算的结果将除以数组元素类型的长度。
如果两个指针所指向的不是同一个数组中的元素,那么它们之间相减的结果是未定义的。
关系运算
对指针执行关系运算也是有限制的。用下列关系操作符对两个指针值进行比较是有可能的:
< <= > >=
不过前提是它们都指向同一个数组中的元素。
当然,也可以在两个任意的指针间执行相等或者不相等测试,因为这类比较的结果和编译器选择在何处存储数据并无关系-------指针要么指向同一个地址,要么指向不同的地址。
参考《C和指针》一书。