C++ 指標運算



正如您所瞭解的,指標是一個地址,它是一個數值;因此,您可以對指標執行算術運算,就像對數值執行算術運算一樣。有四個算術運算子可以用於指標:++、--、+ 和 -

為了理解指標運算,讓我們考慮一下ptr是一個指向地址 1000 的整數指標。假設 32 位整數,讓我們對指標執行以下算術運算 -

ptr++

ptr 將指向地址 1004,因為每次 ptr 增加時,它將指向下一個整數。此操作將指標移動到下一個記憶體位置,而不會影響記憶體位置的實際值。如果 ptr 指向地址為 1000 的字元,則上述操作將指向地址 1001,因為下一個字元將在 1001 處可用。

遞增指標

我們更傾向於在程式中使用指標而不是陣列,因為變數指標可以遞增,而陣列名稱不能遞增,因為它是一個常量指標。以下程式遞增變數指標以訪問陣列的每個後續元素 -

#include <iostream>

using namespace std;
const int MAX = 3;

int main () {
   int  var[MAX] = {10, 100, 200};
   int  *ptr;

   // let us have 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 next location
      ptr++;
   }
   
   return 0;
}

當以上程式碼編譯並執行時,會產生如下結果 -

Address of var[0] = 0xbfa088b0
Value of var[0] = 10
Address of var[1] = 0xbfa088b4
Value of var[1] = 100
Address of var[2] = 0xbfa088b8
Value of var[2] = 200

遞減指標

相同的考慮適用於遞減指標,它會將其值減少其資料型別的位元組數,如下所示 -

#include <iostream>

using namespace std;
const int MAX = 3;

int main () {
   int  var[MAX] = {10, 100, 200};
   int  *ptr;

   // let us have address of the 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[3] = 0xbfdb70f8
Value of var[3] = 200
Address of var[2] = 0xbfdb70f4
Value of var[2] = 100
Address of var[1] = 0xbfdb70f0
Value of var[1] = 10

指標比較

可以使用關係運算符(如 ==、< 和 >)來比較指標。如果 p1 和 p2 指向彼此相關的變數,例如同一陣列的元素,則可以有意義地比較 p1 和 p2。

以下程式修改了前面的示例,透過遞增變數指標來實現,只要它指向的地址小於或等於陣列最後一個元素的地址,即 &var[MAX - 1] -

#include <iostream>

using namespace std;
const int MAX = 3;

int main () {
   int  var[MAX] = {10, 100, 200};
   int  *ptr;

   // let us have 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] = 0xbfce42d0
Value of var[0] = 10
Address of var[1] = 0xbfce42d4
Value of var[1] = 100
Address of var[2] = 0xbfce42d8
Value of var[2] = 200
cpp_pointers.htm
廣告