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

てんC

「 先程のプログラムの→


#include <iostream>


using namespace std;


void newmadefunction(int x)

{


x = x + 5;


cout << x << "\n";


}


int main() {


newmadefunction(5);


return 0;


}

ビルド実行結果

10


てんC「→


このプログラムの


newmadefunction(5);においては


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


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


今度は趣向を変えて


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


         main関数の中で


        変数宣言、初期化された


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


ソーラー「数値データ5でなく変数aか・・・」


#include <iostream>


using namespace std;



void newmadefunction(int x)

{

x=x+5;

cout << x << "\n";

}


int main(){

int a=1;

newmadefunction(a);

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

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

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

cout << a << "\n";

return 0;

}

ビルド実行結果


6

1



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

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


引数であるint xに


main関数内で変数宣言された変数aを代入して


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


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


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


                     

                      おちゃめな 異世界転生C++言語 より

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




てんC

「おちゃめな 異世界転生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に格納されている数値データ1を


自作関数newmadefunction(int x)の


int xに代入する方法を


値渡しといいます。



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



#include <iostream>


using namespace std;



void newmadefunction(int x)

{

x = x + 5;

cout << x << "\n";

}


int main() {

int a = 1;

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

return 0;

}

ビルド実行結果

6


このプログラムでは


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


newmadefunction(int x){

x=x+5;

cout << x << "\n";

}


さきほど述べたように


自作関数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;

の 

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


cout << x << "\n";


が実行されることにより


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


数値データ6がcout出力表示されます。」


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


てんC「


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


命令文cout << a << "\n";を付け加えたプログラム

👇

#include <iostream>


using namespace std;



void newmadefunction(int x)

{

x = x + 5;

cout << x << "\n";

}


int main() {

int a = 1;

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

cout << a << "\n";/*👈この位置に付け加えました*/

return 0;

}



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


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


このプログラムでは


自作関数newmadefunction(a);


の命令文が実行された後


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


cout << a << "\n";


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



では問題です


ビルド実行後


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


cout << a << "\n";が実行され


表示されるのは・・・


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


どう思われますか?ソーラーさん」


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


では


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


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


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


答えは ・・・」


てんC


「ソーラーさん


ビルド実行後の


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


cout << a << "\n";


の実行により


表示されるのは・・・」



ソーラー「愛です。」


てんC「?」



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



てんC 「大正解です。」



ソーラー「やったね!」


てんC

「はいっ 


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


cout << a << "\n";によって


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



void newmadefunction(int x)

{

x = x + 5;

cout << x << "\n";

}


👆

と定義された自作関数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;

cout << x << "\n";

}

👆

a=a+5;


が実行されて


変数aの格納する値は


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


そうはなりません


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


それは


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



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



だけを渡して


       🍓x=x+1;

      

       が実行されている


すなわち


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





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



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


仮引数である変数xは


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


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


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


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


#include <iostream>


using namespace std;



void f(void) {

int x;

x = 1;

x++;

cout<<x<<"\n";

}


int main() {

f();

return 0;

}


ビルド実行結果


2


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

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

x++;により

x=1から

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


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


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


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


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


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


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


🍰🍰🍰🍰🍰



このように

    main関数内で変数宣言された変数aを

   

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

   

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


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


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


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



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

   あるいは

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





           🐥値渡し🐥



といいます。」


マックス「そんな仕組みになっているのか


意外な収穫だな」


ソーラー「


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


🍰🍰🍰🍰🍰



かこまれた

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


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


マックス「他の説明?」


ソーラー「


今述べたことを


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


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


マックス「プログラム上のルールという話でなく


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


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


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


今起こっていることを述べてみようってことなんだよ」


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


ということを述べればよいということですね」


ソーラー「それ、それ🌞


たのむよ てんC」


てんC「かしこまりました」


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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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