C++ 指针VS数组

  • 指针VS数组

    指针和数组密切相关。实际上,指针和数组在许多情况下是可互换的。例如,指向数组开头的指针可以通过使用指针算术或数组索引来访问该数组。考虑以下程序-
    
    #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是一个指向数组开头的常量,不能用作i的值。
    因为数组名称会生成一个指针常量,所以只要不进行修改,它仍可以在指针样式的表达式中使用。例如,以下是为var[2]赋值500的有效语句-
    
    *(var + 2) = 500;
    
    上面的语句有效,并且由于var不变而将成功编译。