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