指针运算主要包含你提到的这几种,它们都有特定的规则和用途,尤其是在处理数组时非常强大。
指针与整数运算
这种运算用于让指针在内存中移动。
- 规则 :当指针
p加上或减去一个整数n时,指针实际移动的字节数是n * sizeof(指针指向的数据类型)。这确保了指针总是按"数据单元"为单位进行移动,而不是简单的字节地址加减。 - 示例 :
- 对于一个
int*类型的指针p(在int占4字节的系统上),p + 1会使地址值增加 4 个字节,指向下一个int元素。 - 对于一个
char*类型的指针q,q + 1会使地址值增加 1 个字节。
- 对于一个
- 核心用途:遍历数组。这是指针最经典的应用场景之一。
指针与指针相减
这种运算用于计算两个指针之间的距离。
- 规则 :只有当两个指针指向同一个数组中的元素时,它们相减才有意义。
- 结果 :结果是一个整数,表示两个指针之间相隔的元素个数,而不是字节数。
- 示例 :如果指针
p1指向数组的第1个元素,p2指向第5个元素,那么p2 - p1的结果是4。 - 注意 :两个指针相加(
p1 + p2)是非法的,没有实际意义。
指针的关系运算
这种运算用于比较两个指针在内存中的相对位置。
- 规则 :同样,只有指向同一个数组(或同一块连续内存区域)的指针进行比较才有实际意义。
- 运算符 :支持
>,<,>=,<=,==,!=六种关系运算符。 - 含义 :比较的是两个指针所指向的内存地址的高低。例如,如果指针
p1指向的元素在数组中位于p2指向的元素之前,那么p1 < p2为真。 - 核心用途 :在遍历数组时作为循环的终止条件,例如
for (; p < &arr[n]; p++)。