C++ 指標與陣列



指標和陣列密切相關。事實上,在許多情況下,指標和陣列是可以互換的。例如,指向陣列開頭的指標可以使用指標算術或陣列樣式索引來訪問該陣列。考慮以下程式:

#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};
 
   for (int i = 0; i < MAX; i++) {
      *var = i;    // This is a correct syntax
      var++;       // This is incorrect.
   }
   
   return 0;
}

將指標運算子 * 應用於 var 是完全可以接受的,但修改 var 的值是非法的。原因是 var 是一個指向陣列開頭的常量,不能用作左值。

因為陣列名會生成一個指標常量,所以只要不修改它,它仍然可以在指標樣式表示式中使用。例如,以下是將 var[2] 的值賦為 500 的有效語句:

*(var + 2) = 500;

上述語句有效,並且可以成功編譯,因為 var 沒有被改變。

cpp_pointers.htm
廣告