Solaris 動的トレースガイド

ポインタ演算

ポインタは、メモリー内の別のオブジェクトのアドレスとして使用される整数に過ぎません。このため、D には、ポインタ演算機能が用意されています。ただし、ポインタ演算は、整数の演算とは別のものです。ポインタ演算では、ポインタで参照されている型のサイズとオペランドの乗除によって、配下のアドレスが暗黙的に変更されます。以下に、この属性を示す D コードの抜粋を示します。

int *x;

BEGIN
{
	trace(x);
	trace(x + 1);
	trace(x + 2);
}

このコードの抜粋では、整数ポインタ x が作成され、その値とその値を 1 増分した値、さらにその値を 2 増分した値がトレースされます。このプログラムを作成して実行したとき、DTrace から返される整数値は、0、4、8 です。

x は整数 (サイズは 4 バイト) のポインタなので、x の値を 1 増分すると、配下のポインタ値は 4 大きくなります。この特性は、ポインタを使って配列などの連続した記憶域の位置を参照する場合に便利です。たとえば、x図 5–2 のような配列 a のアドレスに割り当てた場合、式 x + 1 は式 &a[1] と同じことになります。同様に、式 *(x + 1) は、値 a[1] を参照します。演算子 +=+、または ++ によってポインタ値が増分されている箇所では、D コンパイラにより、ポインタ演算が行われます。

ポインタ演算は、左側のポインタから整数が減算されている箇所、ポインタから別のポインタが減算されている箇所、ポインタに演算子 -- が適用されている箇所でも行われます。たとえば、次の D プログラムは、結果として 2 をトレースします。

int *x, *y;
int a[5];

BEGIN
{
	x = &a[0];
	y = &a[2];
	trace(y - x);
}