値渡しについてご説明いたします

実引数と仮引数とは?実引数から仮引数への値渡しとはなんのことでしょうか? 

アレサ

「 先程のプログラムの→


#include <stdio.h>


void newmadefunction(int x)

{

x=x+5;

printf("%d\n",x);

}


int main(void){


newmadefunction(5);


return 0;

}


コンパイル結果

10


アレサ「→


このプログラムの


newmadefunction(5);においては


自作関数void newmadefunction(int x)内で


定義されたint xに 数値5が代入されていました


今度は趣向を変えて


自作関数void newmadefunction(int x)のint xに


         main関数の中で


        変数宣言、初期化された


        変数aを代入してみます。」


ソーラー「たのむよ~~~🌞🌞🌞 アレサ~~~」


#include <stdio.h>


void newmadefunction(int x)

{

x=x+5;

printf("%d\n",x);

}


int main(void){

int a=1;

newmadefunction(a);

/*ここで自作関数のint xにmain関数で定義された変数aを代入し

変数aに格納されている数値1を

自作関数の引数であるint xに渡しています*/

printf("%d\n",a);

return 0;

}

コンパイル結果


6

1



🍓 🍓 🍓 🍓 🍓 🍓 🍓 🍓 🍓 🍓 🍓 🍓 🍓

このように自作関数newmadefunction(int x)の


引数であるint xに


main関数内で定義された変数aを代入して


変数aに格納されている数値を渡すことができるよう


C言語では設計されています。


これは素朴ですが とても重要な仕組みなんです


                     

                      excellent C言語 より

🍓 🍓 🍓 🍓 🍓 🍓 🍓 🍓 🍓 🍓 🍓 🍓 🍓




アレサ

「excellent C言語 さん


ご説明ありがとうございます



それでは


このプログラムの構造はどうなっているのでしょうか


まずはmain関数内の


newmadefunction(a);


についてですね。


int xに変数aが代入されています


この場合



       🐣int xに変数aが代入されているようにみえる🐦



という言い方が正解ですの


自作関数newmadefunction(int x);のint xに


newmadefunction(a);


と main関数内で定義された変数aがint xに代入された場合


正確には変数aが代入されたのではなく


変数aに格納されている数値1だけが int xに代入されています


このように


変数aに格納されている数値1を


自作関数newmadefunction(int x)の


int xに代入する方法を


値渡しといいます。



では次のプログラムをご覧ください



#include <stdio.h>


void newmadefunction(int x)

{

x=x+5;

printf("%d\n",x);

}


int main(void){

int a=1;

newmadefunction(a);/*ここで自作関数のint xに変数aを代入します*/

return 0;

}


コンパイル結果

6


このプログラムでは


自作関数の定義は次のようになっています


newmadefunction(int x){

x=x+5;

printf("%d\n",x);

}


さきほど述べたように


自作関数newmadefunction(int x)に


newmadefunction(a);と


int xに変数aを代入するということは


int xに変数aに格納されている数値1を代入することになります


つまり


int x=1; が実行されたのと同じことになります


その状態で


x=x+5; が実行されると


変数xに格納されている数値は6となります。


🍓  🍓

(x=x+5;は変数xに格納されている数値に5を加えるという命令文ですね


ですので


この場合は変数xに格納されている数値1に5が加えられ


変数xに格納されている数値は6になります)

🍓  🍓


そして


x=x+5;

の 

次に記述されている命令文


printf("%d\n",x);


が実行されることにより


コマンドプロンプト画面に


数値6がprintf出力表示されます。


ソーラー「なぁ~るほど~\(^o^)/」


アレサ「


ではでは😊 今のプログラムに


命令文printf("%d\n",a);を付け加えたプログラム

👇

#include <stdio.h>


void newmadefunction(int x)

{

x=x+5;

printf("%d\n",x);

}


int main(void){

int a=1;

newmadefunction(a);

/*ここで自作関数のint xにmain関数で定義された変数aを代入します*/

printf("%d\n",a);/*👈この位置に付け加えました*/

return 0;

}



の仕組みを一緒にみていきましょう。ソーラーさん


みなさんも考察してみてください


このプログラムでは


自作関数newmadefunction(a);


の命令文が実行された後


いまの付け加えられた命令文


printf("%d\n",a);


が実行されるのです\(^o^)/



では問題です


コンパイル後


コマンドプロンプト画面に


printf("%d\n",a);が実行され


表示されるのは・・・


1なのですか? 6ですか?


はい、ソーラーさん」


ソーラー「自作関数newmadefunction(a);


では


自作関数の引数であるint xに


変数aに格納されている数値1を渡しただけなので


変数aに格納されている数値は1のまま変化しない


答えは ・・・


アレサ」


「ふふ さあ ソーラーさん


コンパイル後の


コマンドプロンプト画面に


printf("%d\n",a);


の実行により


表示されるのは・・・」



ソーラー「TVコマーシャルです。」


アレサ「コマンドプロンプト画面はYou tubeではありません。」



ソーラー「1です これできまりさ」



アレサ 「ピンポ~ん 大正解です。」



ソーラー「やったね!」


アレサ

「はいっ 


コマンドプロンプト画面に


printf("%d\n",a);によって


表示されている値は 1 となります



自作関数内の変数xに


main関数内で定義された変数aを代入して


変数aに格納されている数値1を


自作関数の引数である変数xに渡して変数xに操作を加えても


変数xと変数aは関連がないので


main関数内の変数a(に格納されている数値1)は


自作関数の操作の影響を受けない


のです



🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋





このプログラムでは


main関数のブロック{}内に


newmadefunction(a);


が記述されています


このような状態は


         🍋自作関数newmadefunctionは🍋


     🍋main関数内に呼ばれて使用されているといえます。🍋



main関数は呼ぶ側で

自作関数newmadefunctionは呼ばれる側ですね



このとき


呼ぶ側のmain関数内で定義された


            変数aは実引数


呼ばれた側の自作関数内で定義された


          変数xは仮引数とよばれます



🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅


ですから


今のプログラムのように


main関数内で

int a=1;


と変数宣言、初期化されていて


newmadefunction(a);


のように


変数aがnewmadefunction(int x);



int x


に記述されていると


自作関数の定義により

void newmadefunction(int x)

{

x=x+5;

printf("%d\n",x);

}


a=a+5;


が実行されて


変数aの格納する値は


a=6に変化するようにみえますが


そうはなりません


☆main関数内で定義された変数aに格納された値が1のまま変化しない☆


それは


自作関数の仮引数である変数xに



   🐥実引数である変数aに格納されている数値データである1🐥



だけを渡して


       🍓x=x+1;

      

       が実行されている


すなわち


変数aとは独立した変数xの値が1増加しているだけだからです」





おまけのコーナーです🍰🍰🍰🍰🍰



呼ばれる側の自作関数内で定義された


仮引数である変数xは


次のプログラムでみられるように


自作関数の操作を受け変数xに格納されている値は変化するよう


システムは構成されています


次のプログラムをご覧ください


#include <stdio.h>


void f(void){

int x;

x=1;

x++;

printf("%dをとりこみました。\n",x);

}


int main(void){

f();

return 0;

}


コンパイル結果

2をとりこみました


自作関数f(); が実行されると

変数xに格納されている値は

x++;により

x=1から

x=2に変化しているのがわかります


(余談ですが前のエピソードで確認したように自作関数の実行されてから終了するまで


x=2のデータ情報はコンピュータのメモリに格納されています😊


自作関数の実行が終了すると


変数xに格納されている値は


メモリに名づけられた変数名xとともに


メモリの節約のため消えてしまいます)


🍰🍰🍰🍰🍰



このように

    main関数内で定義された変数aを

   

   自作関数で定義された変数xに代入しても

   

   main関数内で定義された変数aに格納されている値だけを


   自作関数内の変数xに渡すように


   システムは構成されており


   このように値だけを渡す方法を



  (呼んだ方のmain関数から呼ばれた方の自作関数へ値を渡す方法

   あるいは

   実引数aから仮引数xへ値を渡す方法を)





           🐥値渡し🐥



といいます。」




ソーラー「アレサ


もっとわかりやすく 美しく説明できると思うんだ


🍰🍰🍰🍰🍰



かこまれた

🍰コーナーの部分も含めてね


その方がみんなも喜ぶとおもうよ」


アレサ「はいっ😊 ソーラーさん」


ソーラー「


今述べたことを


プログラム上のルールというお話でなく


メモリという機械の観点から述べてみようよ」


アレサ「プログラム上のルールというお話でなく


メモリという機械の観点からですの・・・」


ソーラー「ようはメモリという機械に


電荷が蓄えられるという観点から


今起こっていることを述べてみようってことさ」


アレサ「つまり メモリでどのようなことが起こっているか


ということを述べればよいということですか・・・?」


ソーラー「それ、それ🌞


たのむよ アレサ」


アレサ「かしこまりました」




      

  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます