在c语言中,指针算术是指针操作的核心内容之一。指针加上或减去一个整数,结果并不是地址值的简单加减,而是按照指针所指向的数据类型大小进行偏移。理解这一点,才能正确使用指针遍历数组,并避开常见的运行时错误。

指针算术的基本用法
指针加减整数时,编译器会自动乘以 sizeof(所指向类型)。例如 int 类型通常占 4 字节,p+1 实际地址为 p + 1*4。
指针加整数与减整数
下面代码展示使用指针遍历 int 数组:
#include <stdio.h>
int main() {
int arr[5] = {10, 20, 30, 40, 50};
int *p = arr; // 指向第一个元素
for (int i = 0; i < 5; i++) {
// p+i 根据 sizeof(int) 偏移
printf("arr[%d]=%dn", i, *(p + i));
}
// 指针减整数
int *q = &arr[4];
q = q - 2; // 指向 arr[2]
printf("after minus: %dn", *q);
return 0;
}
两个指针相减
同类型指针相减得到它们之间相隔的元素个数,结果类型是 ptrdiff_t。
#include <stdio.h>
int main() {
int arr[5] = {1, 2, 3, 4, 5};
int *start = &arr[0];
int *end = &arr[4];
// 相差元素个数,不是字节数
printf("count=%tdn", end - start);
return 0;
}
指针加减运算的限制
虽然指针算术很灵活,但 c 语言对其有明确限制,违反可能导致未定义行为。
- 只能对指向同一数组元素的指针进行加减,或指向数组末尾后一个位置;不能对无关变量地址做加减。
- 不能对函数指针使用算术运算。
- 指针加减后不能越界解引用,允许指向数组末尾后一位,但不能访问该地址。
- 不同数组的指针不能相减或比较大小。
- 空指针 NULL 不能参与加减运算。
错误示例与说明
以下代码存在典型问题:
#include <stdio.h>
int a = 5;
int b = 6;
int main() {
int *p = &a;
// 错误:p 不指向数组,加减越界
int *bad = p + 3; // 未定义行为
// 错误:不同对象指针相减
printf("%tdn", &b - &a); // 未定义行为
return 0;
}
总结
使用 c 语言指针算术时,记住偏移按类型大小计算,且只能在数组范围内操作。合理运用指针加减可以高效遍历数据,但务必遵守语言限制,避免未定义行为导致程序崩溃。
pointer_arithmeticC_languagepointer_restriction修改时间:2026-07-26 14:03:11