それが🌞🌞🌞自作関数の重要な特徴🌞🌞🌞なのです 自作関数を実行してmain関数内で変数宣言された変数に格納されたデータを変更するには自作関数の引数部分にポインタ変数宣言を用いることになります

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

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


ご覧ください。」


#include <stdio.h>


void newmadefunction(int x)

{

x=x+5;

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

}


int main(void){


int a=1;


newmadefunction(a);


/*ここで自作関数newmadefunctionの引数となっているint xにmain関数内で変数宣言された変数aを代入し


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


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


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


return 0;


}


コンパイル結果


6

1


アレサ「


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


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


このとき


呼ぶ側のmain関数内で変数宣言された


            変数aは実引数


呼ばれた側の自作関数内で変数宣言された


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



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



今のプログラムのように


main関数内で


int a=1;


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


newmadefunction(a);


が実行されると


変数aがnewmadefunction(int x);



int x


に記述されているので


自作関数newmadefunctionの定義

👇

void newmadefunction(int x)

{

x=x+5;

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

}

👆



x=x+5;

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


xにaが代入された


a=a+5;


が実行されて


変数aの格納する値は


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


そうはなりません


x=x+5;

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


xにaの格納している値1が代入された状態で


x=x+5;

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


が実行されることになります


よって


コンパイル結果に


6

が表示されることになります


main関数内で


int a=1;


newmadefunction(a);


の次に


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


が実行されることになりますが


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


の実行結果

として


1


が表示されています


このことは


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


ということを表しています



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


それは


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


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


だけを渡して


       🍓x=x+5;

   

       が実行されている


すなわち


変数aとは独立した変数xに格納されている値が5増加しているだけだからです


このように


    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);


/*ここで自作関数newmadefunctionの引数となっている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);

}

👆

により



xのint型の変数宣言


int x


が行われます。


このとき


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


この時点で


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


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


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


ところで


newmadefunction(a);


のように


int xに


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


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


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


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


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


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


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


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


int xに


変数aが代入されると


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



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

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


もちろん


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


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


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


そして


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

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


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

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



次に


自作関数newmadefunctionの定義


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);


/*ここで自作関数newmadefunctionの引数となっているint xにmain関数内で変数宣言された変数aを代入し


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


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


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


return 0;


}


コンパイル結果


6

1


ソーラー「👆


int a=1;


newmadefunction(a);


が実行された場合


自作関数の定義が以下のように設定されているので

👇

void newmadefunction(int x)

{

x=x+5;

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

}

👆

int xにaが代入されて


a=a+5;

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


がおこなわれて

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


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


が実行されると


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


思っちゃうけど


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


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


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


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

      


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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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