|
|
|
1-4-2. インクリメントは+1ではないC言語では以下のような文を良く記述します。++n; // n = n + 1 n += 3; // n = n + 3nが数値の変数なら、1や3が加えられます。しかしnがポインタのときは注意が必要です。 char *pc; long *pl; ++pc; ++pl;これらは同じではありません。pc変数はプラス1ですが、pl変数はプラス4します。なぜか、plが4バイトの変数であるlongのポインタだからです。ポインタのインクリメントや加算減算は、指定した数だけ、値が増減するのではありません。指定した数だけ、ポインタが進むか戻るのです。 long v[10],*pv; pv = v; *pv++ = 10; // v[0]=10; pvはv[1]を差す *pv++ = 20; // v[1]=20; pvはv[2]を差す *(pv+3) = 30; // v[5]=30; v[2]は*(pv+0) // v[3]は*(pv+1) v[4]は*(pv+2)しかしキャストを使えば目的のバイト数だけ増減することができます。 long v[10],*pv; pv = v; *(long *)((char *)pv+sizeof(long)) = 40; // v[1] = 40;これらは構造体のポインタのときも同じ事が言えます。
|