C++ 指針vs 數組
指針和數組是密切相關的。 事實上,指針和數組在很多情況下是可以互換的。 例如,一個指向數組開頭的指針,可以通過使用指針的算術運算或數組索引來訪問數組。 請看下面的程序:
#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 << "Address of var[" << i << "] = "; cout << ptr << endl; cout << "Value of var[" << i << "] = "; cout << *ptr << endl; // 移动到下一个位置 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; // 这是正确的语法 var++; // 这是不正确的 } return 0; }
把指針運算符* 應用到var 上是完全可以接受的,但修改var 的值是非法的。 這是因為var 是一個指向數組開頭的常量,不能作為左值。
由於一個數組名對應一個指針常量,只要不改變數組的值,仍然可以用指針形式的表達式。 例如,下面是一個有效的語句,把var[2] 賦值為500:
*(var + 2) = 500;
上面的語句是有效的,且能成功編譯,因為var 未改變。