C++ 指針 vs 數組

C++ 指針 C++ 指針

指針和數組是密切相關的。事實上,指針和數組在很多情況下是可以互換的。例如,一個指向數組開頭的指針,可以通過使用指針的算術運算或數組索引來訪問數組。請看下麵的程式:

實例

#include <iostream> using namespace std; const int MAX = 3; int main () { int var[MAX] = {10, 100, 200}; int *ptr; // 指針中的數組地址 ptr = var; for (int i = 0; i < MAX; i++) { cout << "var[" << i << "]的記憶體地址為 "; cout << ptr << endl; cout << "var[" << i << "] 的值為 "; cout << *ptr << endl; // 移動到下一個位置 ptr++; } return 0; }

當上面的代碼被編譯和執行時,它會產生下列結果:

var[0]的記憶體地址為 0x7fff59707adc
var[0] 的值為 10
var[1]的記憶體地址為 0x7fff59707ae0
var[1] 的值為 100
var[2]的記憶體地址為 0x7fff59707ae4
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; // 這是正確的語法 var++; // 這是不正確的 } return 0; }

把指針運算符 * 應用到 var 上是完全可以的,但修改 var 的值是非法的。這是因為 var 是一個指向數組開頭的常量,不能作為左值。

由於一個數組名對應一個指針常量,只要不改變數組的值,仍然可以用指針形式的運算式。例如,下麵是一個有效的語句,把 var[2] 賦值為 500:

*(var + 2) = 500;

上面的語句是有效的,且能成功編譯,因為 var 未改變。

C++ 指針 C++ 指針