Cplusplus-cpp-pointers-vs-arrays

提供:Dev Guides
移動先:案内検索

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が配列の先頭を指す定数であり、l値として使用できないためです。

配列名はポインター定数を生成するため、変更しない限り、ポインター形式の式で使用できます。 たとえば、次は、var [2]に値500を割り当てる有効なステートメントです-

*(var + 2) = 500;

上記のステートメントは有効であり、varが変更されていないため、正常にコンパイルされます。