FreeBASIC マニュアルのトップに戻る

FreeBASIC ProPgPtrArithmetic

目次→教本→プログラマーのための案内Pointer Arithmetic←オリジナル・サイト

ポインタ演算 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

←リンク元に戻る プログラム開発関連に戻る

アドレスの値を、数学的に操作します。

概要
ポインタから加算、減算
ポインタを増加させたり、減少させたり
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要素差があるからです。

厳密に言えば、ab が、ともに型 T のポインタならば、それらの間の間隔は、T もしくは下記の式のバイト単位のサイズで分割された、それらの間のバイト数です。
( cast(byte ptr, a) - cast(byte ptr, b) ) / Sizeof(T)


参照:
プログラマーのための案内に戻る
←リンク元に戻る プログラム開発関連に戻る

ページ歴史:2019-07-04 00:31:46
日本語翻訳:WATANABE Makoto、原文著作者:LaananFisher

ホームページのトップに戻る

表示-非営利-継承