参照渡しと値渡し

引数の渡し方には2種類あります。
通常、変数は「値渡し」で関数に送られます。
では、「参照渡し」と「値渡し」の違いを説明します。

値渡し

値渡しは、普通に引数として変数を積む方法です。
この場合、関数内部で処理される変数が新しく生成されます。
つまり、引数である元の変数にはなんら影響はないということです。
値渡しの例
1
2
3
4
5
6
7
function TestFunc(a){
  a = "OK";
}

a = "ABCDEF";
TestFunc(a); //関数呼び出し
Mes(a);
TestFunc内でaに値を代入していますが、このaは自動的にローカル変数として定義されているので、
このaと引数として渡したaはまったく別の変数です
このことはローカル変数で勉強しました。

イメージとしては変数がコピーされる、と思ってもいいでしょう。
次に、参照渡しについて説明します。

参照渡し

先ほどの値渡しとは違い、渡された変数を操作することが出来るのが、この「参照渡し」です。
参照渡しの引数は、変数の前に「var」をつけることで定義できます。
参照渡し関数
1
2
3
4
5
6
7
function TestFunc(var a){
  a = "OK";
}

a = "ABCDEF";
TestFunc(a); //関数呼び出し
Mes(a);
このように「var」を付け、スペースやタブを入れた後で引数名を書きます。
実行すると、ダイアログで「OK」と出るはずです。
つまり、引数として渡した変数が内部で操作されたということです。

参照渡しを使っている命令もあります。
IncDec、文字列切り出し命令等です。

参照渡し、値渡しの例外

基本的に引数は値渡しで渡されると書きましたが、例外もあります。
varをつけない、すなわち値渡しで定義された引数を操作した場合にもとの変数に影響があるものです。

その例外は、オブジェクトです。
オブジェクトを渡す
1
2
3
4
5
6
function TestFunc(a){
  a.Text = "Button";
}

Btn = CButton.Create;
TestFunc(Btn);
aは値渡しですが、aを操作するとBtnに影響があります。

オブジェクトの引数と値渡し

ココから先はちょっと難しい話になるので、読み飛ばしてもかまいません。

Spinelでは、オブジェクトをポインタとして扱っています。
ですから、値渡しとはいえ実際に渡されるのは引数として与えられたオブジェクトそのものです。
つまり、オブジェクトを引数とするもので、参照渡しをする必要はありません。

また、変数の参照渡しでは、ポインタが渡されるわけではありません。
引数として渡された変数そのものを別の変数で直接操作できる仕組みになっています。
たとえば、aという引数が参照渡しで定義されていて、引数としてbという変数が与えられたとき、
aという変数を操作することと、bという変数を操作することはまったく同じ、というわけです。
前へ / index / 次へ
プログラム言語「Spinel
Copyright © 2005 - Giemsa All Rights Reserved.
NOTES Software.