Solaris 動的トレースガイド

ポインタと配列の関係

D でも、ANSI-C の場合と同様に、ポインタと配列には特別な関係があります。配列を表す変数は、最初の記憶域の位置を示すアドレスに関連付けられています。ポインタも、記憶域の位置を示すアドレスであり、あらかじめ型定義されています。このため、D では、ポインタ変数でも配列変数でも、配列インデックスの表記 [ ] を使用できます。たとえば、次の 2 つの D コードの抜粋は、意味的に同じです。

p = &a[0];				trace(a[2]);
trace(p[2]);

左側の抜粋コードでは、式 a[0]& 演算子を適用することにより、ポインタ pa 内の最初の配列要素のアドレスに割り当てています。式 p[2] では、3 番目の配列要素 (インデックス 2) の値をトレースします。p には、a に関連付けられたアドレスが含まれるため、この式からは、右側の抜粋コードの a[2] と同じ値が導き出されます。このような等価性により、C と D では、任意のポインタまたは配列の任意のインデックスへのアクセスが可能です。コンパイラも DTrace 実行環境も、配列境界チェックは行いません。配列に事前定義された値の範囲外のメモリーにアクセスすると、予想外の結果になるか、先ほどの例のように、DTrace から、アドレスが無効であることを示すエラーが報告されます。DTrace そのものやオペレーティングシステムに影響はありませんが、D プログラムをデバッグする必要があります。

ポインタと配列の違いは、ポインタ変数が別の記憶域の整数アドレスを含む記憶域を参照する点です。配列変数は、配列の位置を含む整数アドレスではなく、配列の記憶域そのものを指定します。以下に、この違いを図示します。

図 5–2 ポインタと配列の記憶域

5 つのオブジェクトから成る配列のポインタを示す図です。

この違いは、ポインタを割り当てるときとスカラー配列を割り当てるときの D 構文から明らかです。xy がポインタ変数である場合、式 x = y は正当です。この式では、y 内のポインタアドレスが、x で指定された記憶域の位置にコピーされます。xy がスカラー変数である場合、式 x = y は不正です。D では配列そのものを割り当てることはできません。ただし、配列変数やシンボル名は、ポインタが可能なあらゆる状況で使用できます。p がポインタで a が配列である場合、p = a という文は使用可能です。この文は、p = &a[0] と同等です。