アドレスの値を、数学的に操作します。
概要
ポインタから加算、減算
ポインタを増加させたり、減少させたり
2つのポインタの間の間隔
概要
メモリを通して、1つのアドレスから別のアドレスまで、繰り返すことは、しばしば役に立ちます。
ポインタは、これを達成するために使われます。
ポインタが(
演算子 * (Value of) を使って)逆参照されるとき、ポインタの型が、変数の型や、検索されるオブジェクトを決定するので、ポインタの型は、また、
間隔(distance) を、バイト数で、決定します。そして、ポインタの個々の型は、メモリに場所を確保します。
例えば、
Short は、メモリの 2バイトを取りますが、
Single は 4バイトを必要とします。
ポインタから加算、減算
ポインタは、ちょうど数値型のように、加えたり、引いたりできます。
この加算や減算の結果は、アドレスになります。そして、ポインタの型は、オリジナルのポインタからの間隔を決定します。
例えば、下を参照下さい。
Dim p As Integer Ptr = New Integer
[2]
*p = 1
*(p + 1)
=
2
上の例は、
p によって、値 "
1" と "
2" を、配列ポインタの各整数に代入します。
p は、
Integer Pointer なので、式 "
*(p + 1)" は、
p から
Integer four/eight (32/64bit システムでは 4/8)バイトを修飾参照することを意味します。
この "
1" は、"
1 * Integer のサイズ"、または four/eight (32/64bit システムでは 4/8)バイトの距離を示します。
引き算も、全く同じ規則に従います。
a - b = a + -b
であることを、覚えておいて下さい。
ポインタを増加させたり、減少させたり
ポインタ自体を変更すると便利なことが、時々有ります。足し算と、引き算の演算子の組み合わせが、上のように機能します。
例えば、下を参照下さい。
Dim array(5) As Short =
{ 32, 43, 66, 348, 112, 0 }
Dim p As Short Ptr = @array
(0)
While (*p <> 0)
If (*p = 66) Then Print "66 が見つかりました"
Sleep
p += 1
Wend
上の例は、"0" の値を持った要素を見つけるまで、配列を通して繰り返します。
"66" の値の要素が見つかると、そのメッセージを表示します。
2つのポインタの間の間隔
2つのポインタの間の間隔は、
演算子 - (減算) を使って検索されます。そして、間隔は、バイトではなく、値で測定されます。
例えば、下を参照下さい。
Type T As Single
Dim array(5) As T =
{ 32, 43, 66, 348, 112, 0 }
Dim p As T Ptr = @array
(0)
While (*p <> 0)
p += 1
Wend
Print p - @array
(0)
Sleep
上の例では、T が、どんな型の場合でも、"5" を出力します。
これは、配列 (32) の最初の要素と、p (0) によって示された要素の間には、5要素差があるからです。
厳密に言えば、a と b が、ともに型 T のポインタならば、それらの間の間隔は、T もしくは下記の式のバイト単位のサイズで分割された、それらの間のバイト数です。
( cast(byte ptr, a) - cast(byte ptr, b) ) / Sizeof(T)
参照: