第8講 プロシージャ(2)
第2話 謎の解明
前半のコード
Sub Main() '私は社長だ。
Dim a(0) As Integer '配列を宣言したが箱が1個しか用意されていないので変数を宣言したのと同じ
a(0) = 3
Console.WriteLine("a(0)={0:d}", a(0))
f (a)
Console.WriteLine("a(0)={0:d}", a(0))
End Sub
Sub f(x() As Integer)
x(0) = 5
End Sub
で渡していたものは、箱のアドレスです。
『えっ?!、どういうこと?』
ですね。
今まで変数を箱と比喩してきましたが、
正確に言うと、
変数とは、メモリ(記憶装置)上に与えられた一定のメモリ領域です。
メモリ上にデータ型(変数型)の応じて、一定容量を割り振ったメモリです。
このメモリにデータが書き込まれるのが、変数です。
メモリというと2つの意味があることにご注意下さい。
1つは、記憶装置(半導体メモリ)という意味ですし、
もう一つは、記憶装置上の何バイトかの容量という意味です。
データ型に応じてというのは、
Integer型なら4バイト、Float型なら8バイトなど、
データ型によって容量が異なることを指しています。
例えば、
Dim i As Integer
と宣言したとすると(以下の数字はすべて例えばです)、
のように、メモリ(記憶装置)上に4バイトのメモリが割り振られます。
記憶装置にはデータを書き込む場所があり、
その場所は番地で示されます。
この番地をアドレスというのです。
ただ、上の図で注意していただきたいのは、
変数iに実際に割り振られたのは、
1001,1002,1003,1004
です。1000〜1004と表記するとき、
1000より大きく1004以下というです。
そして、実際に割り振られた1001以上1004以下のメモリ領域の、
アドレスを1000と呼ぶのです。
これはC言語の場合ですが、
おそらくVBでも同じだと思います。
ただ、VBの場合には直接メモリを操作するポインタというものがありませんから、
意識する必要はないのですが、
VBを足がかりにして、C言語やC++を将来勉強したいと思っている方は、
実際に割り振られたメモリの1つ手前の番地をメモリのアドレスというのだということは、
覚えておいて下さい。
f (a)
で渡しているものは、そのアドレスの1000です。
aは箱そのものではなく、
あくまで1000という値なのです。
つまり、金庫(箱)そのものは渡せないませんが、
金庫(箱)のありか=アドレスを教えてあげれば、
その社員専用の金庫を他の社員が扉を開けて使えるようになるのです。
社長室のどこどこに金庫が置いてあるから、
と教えて金庫の使用許可を与えているのが、
f (a)
であると思えば良いのです。
Dim a(4) As Integer
として宣言した配列の場合は、
のように、連続してメモリが確保されます。
この場合先頭アドレス1000を渡してあげれば、
5つのメモリ領域
(1001,1002,1003,1004),(1005,1006,1007,1008),(1009,1010,1011,1012),(1013,1014,1015,1016)
に入っている5つのデータを受け取ることが出来ます。
次話の課題を2つ出します。
@ 実行画面が
1 2 3 4 5 6 7 8 9 10
(ただし、
Rnd(-1)
Randomize(Timer())
がはいっているのでデータの内容は毎回異なります。)
となるプログラムを考えて下さい。
プロシージャ(1)では、変数や配列を渡す方法がなかったので、
データ作成とデータ表示を分業することが出来ませんでしたが、
実質渡せるようになって、分業をさせることができます。
Main()のおいて1次元配列を作り、それの先頭アドレスをf()とg()に渡して、
プロシージャf()はデータを作成して、プロシージャg()はそのデータを表示する、
という分業をして下さい。
A 実行画面が
(ただし、
Rnd(-1)
Randomize(Timer())
がはいっているのでデータの内容は毎回異なります。)
となるプログラムを考えて下さい。
@と同じくMain()が1次元配列を作り、
データ作成はf()が、データ表示はg()が担当するという分業のもとに行って下さい。