- ベストアンサー
値呼出しや参照呼出しについて。
今、ちょうど下記の問題を解きながら、値呼出しと参照呼出しを勉強しています。 https://www.ap-siken.com/s/kakomon/25_haru/q20.html メインプログラムには、X=2、Y=2、ここまでは分かります。 add(X,Y)がありますが、これは手続きadd(X,Y)を呼出しているのですか? 関数名が違うのに、add(X,Y)で、なぜ手続きadd(X,Y)が呼び出されるのですか? 基本的な事が分かっていないので、教えて頂きたいです。 宜しくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
C言語だとして、問題文をプログラム化してみます。 /* add関数(手続きadd)の定義 */ void add(int x, int *y) { /* Xは値渡し、Yは参照渡し */ x = x + *y; *y = x + *y; return; } /* メインプログラム、ここから実行が始まる */ void main (void) { int X = 2; int Y = 4; add(X, &Y); printf("X=%d, Y=%d", X, Y); } ---- こういうプログラムで、最後になんと表示されますか、という問題です。 「手続き add(x,y)」を呼び出す書き方が、「add(X,Y)」です。そういうものなので、そこを疑問には思わないでください…。 さて実は、上記において、メインプログラム内の変数と add関数のローカル変数で、大文字小文字を変えてみました。(大文字・小文字が違えば、一般的には別の変数です。) add(X, Y) として呼び出したとき、addに制御が移った時点で、以下のようになっています。 x ← Xの値がコピーされたものが入る。この場合「2」。 y ← Y変数の格納メモリアドレスが入る。具体的にはスタックポインタ-αですが、まあ、どっかのアドレスが入ると思ってください。 y は参照(メモリアドレス)であるので、その中身を見るときは「*y」として記述します。 x はローカル変数であるので、その値をいくらいじったところで、メインプログラムに影響を及ぼしません。 y もローカル変数なのですが、その指し示すもの、「*y」は、Y変数の実体を指しています。 なので、*y に対して代入操作を行うと、サブルーチン(関数・手続き)から、メインルーチンの変数を操作することができてしまいます。 (x + *y) という式の値は6ですが、それが、ローカル変数への代入と、参照先への代入では結果が違ってくる、それがわかりますか、という問題になっています…。
その他の回答 (3)
- notnot
- ベストアンサー率47% (4900/10358)
> add( )と手続きadd( )だと違いませんか? ああ、「手続き」までが名前の一部だと思ったのですね。 違います。名前はaddだけです。
お礼
いつもありがとうございます! まだまだ知らない事が多すぎますね。頑張ります。
- AsarKingChang
- ベストアンサー率46% (3467/7474)
>関数名が違うのに、add(X,Y)で、なぜ手続きadd(X,Y)が呼び出されるのですか? いや、同じです。 "手続きadd(X,Y)"ではなく、結局add(X,Y)ですので、同じですよ。
お礼
回答して頂きありがとうございました! はい、分かりました。
- notnot
- ベストアンサー率47% (4900/10358)
> 関数名が違うのに、add(X,Y)で、なぜ手続きadd(X,Y)が呼び出されるのですか? どう見ても同じ名前addですけど、何か勘違いしていませんか?
補足
add( )と手続きadd( )だと違いませんか? 手続きが付いてる付いてないという違いがありませんか?
補足
大変詳しく説明して頂き、ありがとうございました!