1. C指针加法和减法介绍
指针是C语言中重要的概念,指针变量存储的是内存地址,可以允许程序直接访问内存单元。与之对应的有指针加法和减法操作,指针加减法操作跟指针类型相关,指针类型决定了指针变量取值的大小以及指针算术运算的方式。
1.1 指针加法操作
指针加法操作就是将指针变量的值加上一个整数,可以得到一个新的指针变量。在指针加法中,假设指针变量的类型是T*,则偏移量是n,操作的结果指向的地址是p,则新地址的计算公式如下:
new_address = p + n * sizeof(T);
其中,sizeof(T)是T类型所占用的字节数。例如,下面的例子中定义一个数组,然后使用指针加法来访问数组元素:
int a[5] = {0, 1, 2, 3, 4};
int *p = a;
// 访问第3个元素
p = p + 2;
printf("%d\n", *p); // 输出:2
上述代码中,定义一个int类型的数组,其中第三个元素的值是2。然后定义一个指向a数组的指针p,p初始时指向第一个元素,即a[0]。通过p = p + 2操作,p指向了第三个元素,即a[2],因此通过*p可以打印出数组中第三个元素的值。
1.2 指针减法操作
指针减法操作跟指针加法操作类似,主要是用于计算两个指针之间的距离。假设指针变量的类型是T*,则偏移量是n,操作的结果指向的地址是p,则新地址的计算公式如下:
new_address = p - n * sizeof(T);
例如,下面的例子中定义两个指向数组元素的指针,然后使用指针减法来计算两个指针之间的距离:
int a[5] = {0, 1, 2, 3, 4};
int *p1 = &a[1];
int *p2 = &a[3];
int distance = p2 - p1;
printf("%d\n", distance); // 输出:2
上述代码中,定义一个int类型的数组,然后定义两个指向数组元素的指针p1和p2,分别指向a[1]和a[3]。通过p2 - p1计算得到两个指针之间相隔两个元素,因此输出结果为2。
2. 指针加法和减法注意事项
在使用指针加法和减法操作时,需要注意以下几点:
2.1 指针越界
在使用指针加法和减法操作时,需要确保指针操作不会越界,否则会导致程序崩溃或者出现异常。例如,在以下代码中访问数组越界:
int a[5] = {0, 1, 2, 3, 4};
int *p = a + 5;
*p = 5; // 访问越界
由于p指向a[5],即超出了数组下标范围,因此程序会崩溃。
2.2 指针类型不匹配
指针加减法操作的结果取决于指针类型的大小。如果类型不匹配,则会出现错误的计算结果。例如,在以下代码中使用不同类型的指针进行加减法操作:
int a[5] = {0, 1, 2, 3, 4};
int *p1 = a;
char *p2 = (char*) p1;
p2 = p2 + 2;
printf("%d\n", (int*)p2 - p1); // 输出:0
由于类型不匹配,指针加减法的结果是错误的。
3. 总结
指针加减法操作是C语言中重要的概念,可以用于数组、字符串等数据结构的访问和操作。在使用指针加减法操作时,需要注意指针的类型和越界问题,以免引发程序崩溃或者出现异常。同时,指针加减法操作的结果取决于指针类型的大小,应该确保类型匹配以得到正确的计算结果。