引数の値渡し・参照渡し

■ 値渡し

 今まで見てきたプロシージャは呼び出すときに引数としてデータを渡しました。その際、データを渡す方法として値渡しを指定しました。値渡しは実引数で指定したデータを仮引数にコピーして渡します。そのため、呼び出したプロシージャ内でデータを変更しても呼び出し元には影響がありません。値渡しは次のように仮引数を宣言します。

値渡しの書式
ByVal 変数名 As データ型

値渡しの仕組み
値渡しの仕組み

 上の図で、呼び出し元から10が呼び出し先の引数に渡されます。その際、値がコピーされて渡されます。呼び出し元の変数と呼び出し先の変数は違うものなので、呼び出し先の変数numに555を代入しても、呼び出し元の変数numは変化がありません。仮引数でByValと指定していますが、By Valueつまり、値で渡すという意味になります。

○ プロジェクト

 次のようにプロジェクトを作成してください。実行するとコンソールに結果が表示されます。

プロジェクトの種類 コンソール アプリケーション
プロジェクト名 ArgumentTest1

サンプルダウンロード

○ プログラム

 次のようにプログラムを入力してください。

  1. Module Module1
  2.  '引数を変更するプロシージャ
  3.  Sub Func(ByVal num As Integer)
  4.   num = 555
  5.  End Sub
  6.  Sub Main()
  7.   '変数を宣言
  8.   Dim num As Integer = 10
  9.   'プロシージャを呼び出す前にnumを表示
  10.   Console.WriteLine("呼び出し前:" & num)
  11.   'プロシージャを呼び出す
  12.   Func(num)
  13.   'プロシージャを呼ぼ出した後にnumを表示
  14.   Console.WriteLine("呼び出し前:" & num)
  15.   Console.ReadLine()
  16.  End Sub
  17. End Module

○ 実行結果

呼び出し前:10
呼び出し後:10

○ 解説

 4行目からプロシージャが定義されています。このプロシージャは呼び出されるときに数値を受け取り、変数に555を代入します。13行目でプロシージャ呼び出し前に変数numを表示します。すると10行目で変数numに10が代入されているので、10が表示されます。16行目で定義してあるFuncプロシージャを呼び出していますが、Funcプロシージャは1つの数値を受け取るように定義されているので、必ず1つの数値を渡します。今回はあらかじめ用意しておいた変数numを実引数に指定しました。これにより変数に格納されているデータがコピーされて渡されることになります。Funcプロシージャ内では変数に555を格納しています。その前には10が入っていますが上書きされます。しかし、実引数の変数に影響はありません。その証拠に19行目で変数numを表示すると10と表示されます。

■ 参照渡し

 参照渡しは実引数で指定した変数の参照先を仮引数にコピーして渡します。そのため、呼び出したプロシージャ内でデータを変更すると、参照先が同じため呼び出し元にも影響が及びます。参照渡しは次のように仮引数を宣言します。

参照渡しの書式
ByRef 変数名 As データ型

参照渡しの仕組み
参照渡しの仕組み

 上の図で、呼び出し元から実引数で指定した変数の参照先(メモリ上のアドレス)が呼び出し先の引数に渡されます。その際、呼び出し元の引数で指定した変数と同じ参照先が呼び出し先の引数の変数で設定されます。呼び出し元の変数と呼び出し先の変数の参照先が同じなので、呼び出し先の変数numに555を代入すると、呼び出し元の変数numも変化します(変化した結果を参照できます)。仮引数でByRefと指定していますが、By Referenceつまり、参照で渡すという意味になります。

○ プロジェクト

 次のようにプロジェクトを作成してください。実行するとコンソールに結果が表示されます。

プロジェクトの種類 コンソール アプリケーション
プロジェクト名 ArgumentTest2

サンプルダウンロード

○ プログラム

 次のようにプログラムを入力してください。

  1. Module Module1
  2.  '引数を変更するプロシージャ
  3.  Sub Func(ByRef num As Integer)
  4.   num = 555
  5.  End Sub
  6.  Sub Main()
  7.   '変数を宣言
  8.   Dim num As Integer = 10
  9.   'プロシージャを呼び出す前にnumを表示
  10.   Console.WriteLine("呼び出し前:" & num)
  11.   'プロシージャを呼び出す
  12.   Func(num)
  13.   'プロシージャを呼ぼ出した後にnumを表示
  14.   Console.WriteLine("呼び出し前:" & num)
  15.   Console.ReadLine()
  16.  End Sub
  17. End Module

○ 実行結果

呼び出し前:10
呼び出し後:555

○ 解説

 4行目からプロシージャが定義されています。このプロシージャは呼び出されるときに実引数の参照を受け取り、変数に555を代入します。13行目でプロシージャ呼び出し前に変数numを表示します。すると10行目で変数numに10が代入されているので、10が表示されます。16行目で定義してあるFuncプロシージャを呼び出していますが、Funcプロシージャは1つの数値を受け取るように定義されているので、必ず1つの数値を渡します。今回はあらかじめ用意しておいた変数numを実引数に指定しました。これにより変数の参照先が渡されることになります。Funcプロシージャ内では変数に555を格納しています。格納先は実引数で指定した変数と同じ場所に格納されます。そのため実引数の変数に影響が及びます。その証拠に19行目で変数numを表示すると555と表示されます。

前へ