ポインタ変数は、加算したり、減算したりして、アドレス値を変更する事ができます。
#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;1
ip = idata;1
}
|
1の後、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ずつ進む。と言うワケです。
この辺りは、デバッグツールで、ポインタの値が増えていく様子を観察すると、
より一層理解しやすくなります。
スポンサードリンク
|