配列とポインタ

配列

データを格納するには変数を使います。
変数が少なければ問題ありませんが、たとえば従業員リスト、成績表など、1000個の変数を宣言したい場合、どうしたらよいでしょう。
1つ1つ宣言するという方法もあります。Dim l1 As Long,l2 As Long,l3 As Long l4 As Long l5 As Long....
しかしこんなことをしていれば、宣言するだけで日が暮れてしまいます。1000個ならいいですが100000個ならどうにもなりません。
そこで配列を使います。
配列は以下のように宣言します。
Dim 配列名[個数] As 型
変数の宣言とほとんど同じです。[]の中に個数を書くだけです。
実際に配列を利用したプログラムを書いてみます。
#console
#include<vcrt71.sbp>

Dim s[5] As Long

s[0] = 0
s[1] = 9*1
s[2] = s[1] * 2
s[3] = s[2] * 3
s[4] = 10
s[5] = 99

printf(Ex"%d\n%d\n%d\n%d\n%d\n%d\n" ,s[0],s[1],s[2],s[3],s[4],s[5])
使い方はなんとなく分かるでしょう。 Dim x[3] As Longと宣言すれば、x[0]からx[3]まで4個のlong型変数を宣言したことになります。
x[2] = 2+4などと普通の変数と同じように扱うことができます。
ただ、配列には問題があります。添え字([]の数値)が宣言したときよりも大きかったりマイナス(x[-3]など)になると、エラーになります。
しかもABではコンパイルでき、実行時に強制終了になります。
少し見つけにくいバグになるので、添え字は注意してください。

ポインタ

ポインタは変数のアドレスのことです。
変数はメモリのどこかに格納されています。そのアドレスがポインタです。

#console
#include<vcrt71.sbp>

Dim lp As DWordPtr'*DWordでも可
Dim a As Long,b As Long

a = 32

lp = VarPtr(a)'変数aのアドレスをlpにコピー
b = GetDWord(lp)'ポインタ変数lpの内容を変数bにコピー

printf(Ex"a=%d b=%d\n" , a,b)
このプログラムについて説明します。
ポインタを利用するにはポインタ変数を宣言します。DwordPtrのようにPtrがついた型を宣言をします。
Dim lp As DWordPtrでlpがポインタ変数になります。
VarPtr関数で変数aのアドレスを取得しlpに渡しています。lp=aとやるとlpはaの値である32、32番地を指してしまいます。
ポインタ変数からデータを取り出すにはGetDWord関数です。(変数の型によってGetDouble、GetByteなど使い分ける必要があります)
b=lpとするとbにlpの値、すなわち先ほどコピーした変数aのアドレスが代入されます。
さいごにaとbの値を表示しています。どちらも32になるはずです。

配列のアドレスについて
配列のアドレスを得るにはVarPtr(x[4])というようにします。
配列の先頭だとVarPtr(x[0])になりますがxだけでも先頭アドレスになります。
配列の名前=配列のアドレスです。