C言語 ポインタのアドレス計算

ポインタ変数は、加算したり、減算したりして、
アドレス値を変更する事ができます。

#include <stdio.h>

void main(void) {
      char cdata[5];
      char* cp;
      int idata[5];
      int* ip;

      cdata[0] = 's';
      cdata[1] = 't';
      cdata[2] = 'a';
      cdata[3] = 'r';
      cdata[4] = '\0';

      idata[0] = 5;
      idata[1] = 10;
      idata[2] = 15;
      idata[3] = 20;
      idata[4] = 25;

      cp = cdata;
      ip = idata;

}

cp = cdata; と言う文の実行後、
cp++ とした場合、*cp の値は、cdata[1] と同じ意味となり、t となります。
もう1度 cp++ としても同じで、
*cp の値は、cdata[2] と同じ意味となり、a となります。

内部的には、cp++ とすると、char型なので、
1(バイト)アドレス分プラスされる事になります。

ip++ とした場合も同様で、*ip の値は、
idata[1] と同じ意味となり、10 となります。
もう1度 ip++ としても同じで、
*ip の値は、idata[2] と同じ意味となり、15 となります。

内部的には、ip++ とすると、int型なので、
4(バイト)アドレス分プラスされます。

結果的に言うと、「ポインタ変数 + 1」を行うと、
実際には、数値的に1増えるのではなく、
ポインタが指すデータ型のバイト分だけプラスされる。
と言う事になります。

なので、int型配列のアドレス計算の時も1ずつ進まず、
4ずつ進む。と言うワケです。

この辺りは、デバッグツールで、
ポインタの値が増えていく様子を観察すると、
より一層理解しやすくなります。

■参考記事
ポインタと配列の関係

タイトルとURLをコピーしました