指针和数组是密切相关的。事实上,指针和数组在许多情况下是可互换的。例如,一个指针,指向一个数组的开头可以通过使用指针运算或数组式的索引访问数组。考虑下面的程序:
#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 yiibaier. 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; // yiibai 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不会改变。