ポインター
紹介
この文書はWaveのポインター活用方式について説明する文書です。 Waveは低レベルシステムプログラミングをサポートする言語として、明示的なメモリアドレス操作を可能にするためにポインタ機能を提供します。 ポインターは特定のタ イプのメモリアドレスを指す変数であり、これを通じて値への直接的なアクセス及び修正が可能です。
ポインター宣言
Waveでポインターはptr<タイプ>
形式で宣言します。 例えば、整数型ポインターは次のように宣言できます:
var p: ptr<i32>;
この宣言は、i32
型の値を指すポインタp
を生成します。
ポインタ初期化
ポインタは、変数のアドレスを&
演算子を使用して初期化できます。
var a: i32 = 10;
var p: ptr<i32> = &a;
ここで&a
は変数a
のメモリアドレスを意味し、p
はそのアドレスを指すポインタになります。
ポインタ逆参照
ポインタが指す値を読み取ったり変更したりするには、deref
キーワードを使用します。 これを逆参照と言います。
var a: i32 = 10;
var p: ptr<i32> = &a;
println("{}", deref p); // 10 出力
deref p = 20;
println("{}", a); // 20 出力
NULLポインタ
Waveでは、ヌルポインタをnull
キーワードで表現します。
ポインタ変数はnull
で 初期化され、この場合は有効なメモリを指しません。
var p: ptr<i32> = null;
ヌルポインタを逆参照すると、コンパイラはエラーを発生させます。
多重ポインタ
Waveは多重ポインタをサポートしています。 ポインタを複数段階にネストして宣言および使用できます。
var x: i32 = 1;
var p1: ptr<i32> = &x;
var p2: ptr<ptr<i32>> = &p1;
var p3: ptr<ptr<ptr<i32>>> = &p2;
println("{}", deref p1); // 1
println("{}", deref deref p2); // 1
println("{}", deref deref deref p3); // 1
配列とポインタ
ポインタは配列要素や配列自体を指すこともできます。