您可以像对数值一样对指针执行算术运算,因为正如您现在所知,指针是地址,地址是一种数值。 ++、--、+ 和 - 是可以应用于指针的四种主要算术运算符。
为了更清楚地理解指针算术,我们假设 ptr 是一个指向地址 1000 的整数指针。假设我们在处理 32 位整数,我们对指针执行以下算术运算:
ptr++
因为 ptr 总是指向下一个整数,当它增加时,它将指向 1004 的位置。此操作将在不更改内存地址处实际值的情况下,将指针移至下一个内存位置。如果 ptr 指向地址为 1000 的字符,则上述操作将指向 1001 的位置,因为下一个字符将在 1001 处可用。
在我们的程序中,我们更倾向于使用指针而不是数组,因为指针可以递增,而数组名不能,因为它是一个常量指针。
下面提供的程序递增变量指针,以便访问数组中的每个连续元素。
#include <iostream>
using namespace std;
const int MAX = 4;
int main () {
int var[MAX] = {20, 200, 400,800};
int *ptr;
// let us have an array address in pointer.
ptr = var;
for (int i = 0; i < MAX; i++) {
cout << "Address of var[" << i << "] = ";
cout << ptr << endl;
cout << "Value of var[" << i << "] = ";
cout << *ptr << endl;
// point to the very next location
ptr++;
}
return 0;
}
输出
Address of var[0] = 0x7ffd1e87ae70 Value of var[0] = 20 Address of var[1] = 0x7ffd1e87ae74 Value of var[1] = 200 Address of var[2] = 0x7ffd1e87ae78 Value of var[2] = 400 Address of var[3] = 0x7ffd1e87ae7c Value of var[3] = 800
当递减指针时,将应用相同的规则,将其值减少相应数据类型的字节数,如下所示。
#include <iostream>
using namespace std;
const int MAX = 4;
int main () {
int var[MAX] = {20, 200, 400,800};
int *ptr;
// let us have the address of the very last element in pointer.
ptr = &var[MAX-1];
for (int i = MAX; i > 0; i--) {
cout << "Address of var[" << i << "] = ";
cout << ptr << endl;
cout << "Value of var[" << i << "] = ";
cout << *ptr << endl;
// point to the previous location
ptr--;
}
return 0;
}
输出
Address of var[4] = 0x7ffc911ead8c Value of var[4] = 800 Address of var[3] = 0x7ffc911ead88 Value of var[3] = 400 Address of var[2] = 0x7ffc911ead84 Value of var[2] = 200 Address of var[1] = 0x7ffc911ead80 Value of var[1] = 20
可以使用 ==、<、> 等关系运算符来比较指针。如果 P1 和 P2 都指向彼此相关的变量,例如同一数组的元素,则它们可以有意义地进行比较。
下一个程序通过递增变量指针来修改前面的示例。它指向的地址必须大于或等于数组最后一个元素的地址,即 &var[MAX - 1]。
#include <iostream>
using namespace std;
const int MAX = 4;
int main () {
int var[MAX] = {20, 200, 400,800};
int *ptr;
// let us have an address of the first element in pointer.
ptr = var;
int i = 0;
while ( ptr <= &var[MAX - 1] ) {
cout << "Address of var[" << i << "] = ";
cout << ptr << endl;
cout << "Value of var[" << i << "] = ";
cout << *ptr << endl;
// point to the previous location
ptr++;
i++;
}
return 0;
}
输出
Address of var[0] = 0x7ffc438558c0 Value of var[0] = 20 Address of var[1] = 0x7ffc438558c4 Value of var[1] = 200 Address of var[2] = 0x7ffc438558c8 Value of var[2] = 400 Address of var[3] = 0x7ffc438558cc Value of var[3] = 800