1-16-3. ポインタと配列

公開日: 23:56 1. 基本編/1-16. ポインタ/1-16-3. ポインタと配列


ポインタと配列は深く関係しています。実際、ポインタと配列は多くのケースで交換できます。例えば、配列の先頭を指すポインタはその配列にポインタ算術または配列型の添字を使ってアクセスできます。次のプログラムを考えてみましょう。
#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]のアドレス = 0xbfa088b0
var[0]の値 = 10
var[1]のアドレス = 0xbfa088b4
var[1]の値 = 100
var[2]のアドレス = 0xbfa088b8
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が変更されないからです。
  • ?±??G???g???[?d????u?b?N?}?[?N???A

0 件のコメント :

コメントを投稿