赋值(Assignment):可以将一个指针赋值为另一个相同类型的指针,或者赋值为一个地址(如使用取地址运算符&)。这是最基本的运算,非常有意义。
加减整数(Addition/Subtraction of an Integer):指针加上或减去一个整数,表示指针向前或向后移动若干个元素。这在数组遍历中非常有用。例如,p + 1指向下一个元素,而不是下一个字节(注意:移动的字节数取决于指针所指向的类型的大小)。
递增和递减(Increment/Decrement):指针的++和--操作,相当于加减整数1,常用于指针遍历数组。
两个指针相减(Subtraction of Two Pointers):两个相同类型的指针相减,得到的是它们之间相隔的元素个数。这常用于计算数组中两个元素之间的距离。注意:两个指针相加没有意义。
比较(Comparison):指针可以使用关系运算符(如<, <=, >, >=, ==, !=)进行比较。这常用于判断指针的相对位置(例如在同一个数组中)或者是否指向同一地址。
与NULL或nullptr比较:判断指针是否为空,这是避免野指针和内存错误的重要手段。
类型转换(Casting):有时需要将指针从一种类型转换为另一种类型,例如将void*转换为具体类型指针,或者在不同类型的指针之间进行转换(需要注意安全性和对齐问题)。
无意义的指针运算:
两个指针相加:没有意义,因为结果是一个无法预知的地址,而且可能不在合法的内存范围内。
指针乘以或除以一个整数:没有定义这样的运算。
指针与指针之间进行位运算:通常没有意义,因为指针是地址,位运算后的地址很可能无效。
注意:所有的指针运算都必须确保指针指向的是有效的内存区域(或者是有效的偏移,比如数组尾后的下一个位置),否则会导致未定义行为。
因此,有意义的指针运算包括:赋值、加减整数、递增递减、两个指针相减、比较以及与空指针比较。