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

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

アレサ

「 先程のプログラムの→


#include <stdio.h>


void newmadefunction(int x)

{

x=x+5;

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

}


int main(void){


newmadefunction(5);


return 0;

}


コンパイル結果


10


アレサ「→


このプログラムの


newmadefunction(5);


の実行においては


自作関数newmadefunctionの定義内の


void newmadefunction(int x)内で


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


今度は趣向を変えて


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


         main関数の中で


        変数宣言、初期化された


        変数aを代入する


newmadefunction(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関数内で


aの変数宣言


int a=1;


が実行されています


次に


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を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; が実行されたのと同じことになります


その状態で


自作関数newmadefunction内の


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 となります


void newmadefunction(int x)

{

x=x+5;

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

}

👆

と定義された自作関数newmadefunctionが実行されるとき


int xに


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


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


自作関数の引数であるint xに渡したのち


変数xに操作を加えて変数xに格納されている数値を変更したとしも


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


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


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


のです



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





このプログラムでは


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で共有
  • はてなブックマークでブックマーク

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る