写代码的时候,经常会遇到需要遍历数组或者处理内存地址的情况。这时候,指针算术运算符就派上用场了。它不像加减乘除那样直观,但在C或C++这类语言里,用好了能省不少事。
什么是指针算术运算符
简单说,就是对指针变量做加减操作。比如你有一个指向整数的指针,给它加1,并不是地址值加1,而是跳到下一个整数的位置。这是因为指针的加减会根据所指向数据类型的大小自动调整步长。
举个例子,假设一个int占4个字节,那么指针p加1,实际地址会增加4,而不是1。
int arr[5] = {10, 20, 30, 40, 50};
int *p = arr; // p 指向数组第一个元素
p++; // 现在 p 指向第二个元素,也就是20
printf("%d\n", *p); // 输出 20
常见使用场景
在处理字符串时也经常用到。比如你想逐个检查一个字符串里的字符,可以用指针一步步往后移。
char *str = "hello";
while (*str != '\0') {
printf("%c\n", *str);
str++; // 指针向前移动一个字符位置
}
这里str++每次移动1个字节,因为char类型就是1字节,所以刚好对应每个字符。
小心越界问题
指针乱跑容易出事。比如数组只有5个元素,你非得让指针跑到第10个位置去读数据,程序可能直接崩溃。这种情况就像你家住在3楼,非要往上爬到不存在的10楼,结果一脚踩空。
还有,只能做加减,不能做乘除。比如p * 2这种写法是非法的。指针不是普通数字,不能随便算。
和其他操作符配合使用
有时候会看到*p++这样的写法。这其实是先取当前指针指向的值,然后指针自己往后挪一位。优先级和结合性在这里起了作用,别搞混了。
int arr[] = {1, 2, 3};
int *p = arr;
int val = *p++; // val 得到1,之后p指向2
要是写成*++p,那就是先让指针加1,再取值,结果就不一样了。