アークピットのホームページに戻る

WinAPIトピックのトップページに戻る

APIトピックの各章に移動する

ダウンロードのページに移動する
ダウンロードができ
ない場合の対処法
 

ページ移動

1-4-2. インクリメントは+1ではない

 C言語では以下のような文を良く記述します。
	++n;		// n = n + 1
	n += 3;		// n = n + 3
 nが数値の変数なら、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;
 これらは構造体のポインタのときも同じ事が言えます。

ページ移動