C++ 中的指针运算


2022年9月15日, Learn eTutorial
1918

您可以像对数值一样对指针执行算术运算,因为正如您现在所知,指针是地址,地址是一种数值。 ++、--、+ 和 - 是可以应用于指针的四种主要算术运算符。

为了更清楚地理解指针算术,我们假设 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