ポインタのポインタ

以下はAB5CP3での話です。他のバージョンではどうなってるのか知りません。
ABでポインタのポインタを触るのは危険な感じがするので、
使わないほうがいいと思います。

さてポインタのポインタについてお勉強しましょう。
ポインタへのポインタというほうが分かりやすいですよね。

Dim p[10] As *DWord と宣言したらp[0] からp[10]というDWord型へのポインタが11個できます。(Cとかだとp[0]からp[9]の計10個)
この配列部分をポインタにしたのがポインタへのポインタです。

ポインタ配列

ポインタ配列は配列なのでサイズは固定です。 10個のポインタを宣言したらそれ以上にもそれ以下にも出来ません。

ポインタへのポインタ

ポインタへのポインタは全部ポインタなので、好きな所を指し示すことが出来ます。
単一のポインタを指しても良いし、ポインタ配列を指すこともできます。

ポインタへのポインタ → ポインタ → データ

ポインタへのポインタ → ポインタ配列
                        +-----------+
                        |ポインタ[0]| → データ1
                        |ポインタ[1]| → データ2
                        |ポインタ[2]| → データ3
                        |ポインタ[3]| → データ1
                        +-----------+

上の例はポインタを指しているだけですが、
下の例はポインタ配列を指しています。
このようにすれば多次元配列をポインタで扱うことが出来るわけです。

ポインタへのポインタを使った例

宣言は次のような方法で。
Dim pp As **ByteとかDim ipp As **Long
のようにするだけです。
Dim dpp As *DWordPtr
のようにしても意味は同じですよ。

'ポインタへのポインタ
#console
#include <vcrt71.sbp>

Dim pp As **Byte'ポインタへのポインタ
Dim i As Long

pp = malloc(SizeOf(*Byte) * 10)'Byte型へのポインタを10個作る

'各ポインタに100バイト与える
For i = 0 To 9
    pp[i] = malloc(100)
Next

'代入
strcpy(pp[0], "ABC")
strcpy(pp[1], "あいう")
strcpy(pp[2], "今日のおやつはコーヒーに納豆")
pp[3][0] = 0

'つなぎ変え
pp[4] = pp[1]
pp[1] = pp[2]
pp[2] = pp[4]

'表示
i = 0
while pp[i][0]
    puts(pp[i])
    i++
Wend

getchar()'待ち
exit(0)