実引数と仮引数とは?実引数から仮引数への値渡しとはなんのことでしょうか? 今度はメモリに電荷が蓄えられるという視点からお話してみたいと思います その3

アレサ「では次のプログラムを


ご覧ください。」


#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


アレサ「


main関数は自作関数を呼ぶ側で


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


このとき


呼ぶ側の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増加しているだけだからです」


このように


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


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


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


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


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


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


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


   あるいは


   実引数aから仮引数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にmain関数で定義された変数aを代入し


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


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


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


return 0;


}


コンパイル結果

6

1


アレサ「変数宣言


int a=1;


により


あるメモリに変数aと名前がつけられます。


そして


そのメモリに1というデータが格納されることになります。


次に


newmadefunction(a);


が実行されると


自作関数の定義


void newmadefunction(int x)

{

x=x+5;

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

}


により



int x


の変数宣言が行われます。


このとき


あるメモリに変数xと名前がつけられます。


この時点で


変数aと名前を付けられたメモリと


変数xと名前を付けられたメモリの


2つのメモリが存在することになります


ところで


newmadefunction(a);


のように


int xに


変数aが代入されるわけですが


メモリは機械なので(笑)


当然のことですが・・・」


ソーラー「あっ!わかった!


変数aと名前を付けられたメモリを


変数xと名前を付けられたメモリに


ねじこんでいるわけではないんだね。」


アレサ「その通りです ソーラーさん


int xに


変数aが代入されると


変数aと名前を付けられたメモリに格納されているデータ(電荷)



変数xと名前を付けられたメモリに格納されることになります。

(変数xと名前を付けられたメモリに電荷が蓄えられることになります)


もちろん


変数aと名前を付けられたメモリ


変数xと名前を付けられたメモリ


ともに存在していることになります。


そして


変数aと名前を付けられたメモリに数値データ1が格納されていたので

(数値データ1に相当する電荷が蓄えられていたので)


変数xと名前を付けられたメモリにも数値データ1が格納されることになります

(数値データ1に相当する電荷が蓄えられることになります)



次に


自作関数の定義


void newmadefunction(int x)

{

x=x+5;

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

}



x=x+5;


が実行されます


これは


変数xという名前の付いたメモリに格納されている数値に5を加えよ


という命令文ですので


変数xという名前の付いたメモリに格納されるデータは1から6になります

(数値データ6に相当する電荷が蓄えられます)


そして


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


が実行されると


変数xという名前の付いたメモリに格納されている数値6が


コマンドプロンプト画面に表示されることになります


ここでも


当然のことですが


変数xと名前を付けられたメモリ



変数aと名前を付けられたメモリ



独立したメモリなので


変数xという名前の付いたメモリに格納されているデータが6でも


変数aと名前を付けられたメモリに格納されているデータは1のままですね


ですから


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


が実行されたならば


変数aと名前を付けられたメモリに格納されたデータ1が


コマンドプロンプト画面に表示されることになります


コマンドプロンプト画面に6が表示されることはありません。」


ソーラー「わお ほんとだ


このプログラムを


頭で追って考えると」


#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


ソーラー「自作関数の定義


void newmadefunction(int x)

{

x=x+5;

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

}


により


int xにaが代入されると


a=a+5;

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


がおこなわれて

変数aに格納される値は6となり


コマンドプロンプト画面に6が表示されると


思っちゃうけど


メモリにデータが格納されるという観点から考えると


そのようなことが起こらないのがわかるね」


アレサ「はい😊 これが値渡しと呼ばれる状態ですが


とても普通のことが行われているのですの」

      


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

作者を応援しよう!

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

応援したユーザー

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