グローバル変数bを自作関数の引数となったグローバル変数bに代入した場合も値渡しとなるためグローバル変数bは自作関数の操作を受けることはなくグローバル変数bに格納されている数値は変更されません。

ソーラー「先程のプログラムのように


グローバル変数bを自作関数の引数部分の()内で変数宣言された変数aに代入して


自作関数を実行した場合も


グローバル変数bの格納している値だけが


自作関数の引数部分の()内で変数宣言された変数aに


値渡しされるんだね。

👇

#include<stdio.h>


int b=2;


int f(int a) {

a =a+1;

return a;

}


int main(void){


printf("%d\n",f(b));//☀️自作関数fの引数としてint aにグローバル変数bが代入されています

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


return 0;

}


コンパイル結果


3

2


アレサ

「グローバル変数bでなく


main関数内で変数宣言され


作製された


main関数のローカル変数bを


自作関数f(int a)内で変数宣言された


自作関数の引数となっている変数aに


代入した場合のプログラムは


次のようになっていました。

( プログラムは少し下の方になります)


そのときも


main関数内で変数宣言され


作製された


main関数のローカル変数bに格納されていた値のみが


変数aに代入されていたのですね。


#include<stdio.h>


int f(int a) {

a = a + 1;

return a;

}


int main(void){

int b=2;

printf("%d\n",f(b));// ☀️自作関数fの引数としてint aにmain関数のローカル変数bが代入されています

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


return 0;

}


コンパイル結果


3

2



アレサ「値渡しのシステムは


main関数内で変数宣言されたローカル変数bを


自作関数の引数部分()内で変数宣言された


ローカル変数aに代入した場合も


グローバル変数として変数宣言されたグローバル変数bを


自作関数の引数部分()内で変数宣言された


ローカル変数aに代入した場合も


同様に機能し


グローバル変数b

ローカル変数b


に格納されている値2だけが変数aに渡されているのですね


変数aという名前の付いたメモリ

変数bという名前の付いたメモリ


が2つ


独立して存在しているためにおこる現象でした。


ですから


f(b)の実行において


グローバル変数b

ローカル変数b

ともに自作関数fの操作の影響を受けず


グローバル変数b

ローカル変数b


に格納されている値は2のままなのですの」


ソーラー「ふふふ


なあるほど~


では~


このプログラムではどうかな?」


#include<stdio.h>


int f(int b) {

b=b+1;

return b;

}


int main(void){

int b=2;

printf("%d\n",f(b));

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


return 0;

}


コンパイル結果


EAZY IDECの場合


3

2


Visual Studioの場合


3

2


ソーラー「このプログラムの命令文


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


によって表示される値は


2かな?


それとも3かな?」


アレサ「はい


この場合 


大分 前のエピソードでみてきたように


main関数内で定義されたローカル変数bと


自作関数内で定義されたローカル変数b



それぞれ別の変数とコンピューターに認識されることになります


ですので


main関数内で定義されたローカル変数bが


自作関数内で定義されたローカル変数bに代入された場合も



main関数内で定義されたローカル変数bが


自作関数内で定義されたローカル変数aに代入された場合に


main関数内で変数宣言されたローカル変数bに格納されている値2だけが


自作関数内で変数宣言されたローカル変数aに値渡しされたのと同様に


main関数内で変数宣言されたローカル変数bに格納されている値2だけが


自作関数内で変数宣言されたローカル変数bに値渡しされます



つまり


main関数内で変数宣言されたローカル変数bのメモリ

自作関数内で変数宣言されたローカル変数bのメモリ


の2つが独立して存在しているのですね。


よって


自作関数の実行時に


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

ローカル変数bのメモリに格納されている数値2を


自作関数内で変数宣言されたローカル変数bに渡しても


main関数内で変数宣言されたローカル変数bのメモリに格納されている値は


自作関数による操作を受けて変更されることはなく


main関数内で変数宣言された変数bに格納されている値は


2のまま変化しません


よって

printf("%d\n",f(b));


の実行により


main関数内で変数宣言されたローカル変数bが

f(b)

自作関数に代入されても


main関数内で変数宣言されたローカル変数bが格納している値2だけが


自作関数fの引数として渡されることになります


自作関数の定義の


b=b+1;


が実行されると


自作関数内で変数宣言されたローカル変数bに格納されている値は


3になりますが


main関数内で変数宣言された変数bに格納されている値は


2のまま変化しません。


ですので


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


によってprintf出力表示される


main関数内で定義されたローカル変数bに格納されている値は


2となります」


ソーラー「ではでは😊


さらに


このプログラムはどうかな?」


#include<stdio.h>


int b = 2;

int f(int b) {

b = b + 1;

return b;

}


int main(void) {


printf("%d\n", f(b));

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


return 0;

}


ソーラー

「このプログラムでは


自作関数fの定義の引数部分の()内で記述されている


int b = 2;


によって生成される変数bは


ローカル変数bで


プログラムの冒頭で自作関数fの前に記述されているint bによって生成される変数bは


グローバル変数bとなっています


そして



printf("%d\n", f(b));


の実行において


数値データ2が格納されているグローバル変数bを自作関数の引数となっている


ローカル変数bに代入しているわけです。


f(b)が実行されると


b=b+1;


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



このとき


printf("%d\n",b);により表示される値は


2

なのでしょうか


3なのでしょうか?


さすがにこの状態で


自作関数f(int b)の引数として


f(b)


のように代入された


グローバル変数bは


自作関数fの操作による影響を受けて


b=b+1;


が実行されて


グローバル変数bに格納されている値は2から3に


変化するようにもおもえるよね。」



アレサ「どうなりますでしょうか


みなさんは


printf("%d\n",b);によって表示されるグローバル変数bの値は


どのようになるとお考えになられますか?」



(^_-)-☆



ソーラー「さあ みなさん


この面白いプログラムをコンパイルしていいかな?」


#include<stdio.h>


int b = 2;

int f(int b) {

b = b + 1;

return b;

}


int main(void) {


printf("%d\n", f(b));

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


return 0;

}







ソーラー「それではっ コンパイルっ」






コンパイル結果


EAZY IDECの場合


3

2


Visual Studioの場合


3

2


ソーラー「このプログラムでは


自作関数fの引数部分の()で記述されている変数bは


ローカル変数bで


プログラムの冒頭でint b = 2;


と変数宣言された変数bは


グローバル変数bなのですが



グローバル変数bを


自作関数の引数にf(b)


と代入しても


グローバル変数bが格納している2が


自作関数の引数となっているローカル変数bに


値渡しされるだけなのです



このとき


プログラムの冒頭で変数宣言されたグローバル変数bと名付けられたメモリ



自作関数内で変数宣言されたローカル変数bと名付けられたメモリ


の2つが独立して存在しています。


よって


プログラムの冒頭で変数宣言された


グローバル変数bと名付けられたメモリに格納されている数値2を


自作関数fの引数部分の()内で変数宣言されたローカル変数bと名付けられたメモリに渡しただけでは


プログラムの冒頭で変数宣言された


グローバル変数bと名付けられたメモリに格納されている値は


自作関数fの操作を受けて変更されるというようなことはなく


プログラムの冒頭で変数宣言された


グローバル変数bと名付けられたメモリに格納されている値は


2のまま変化しません


ですので


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


の命令文により表示されるbの値は


グローバル変数宣言


int b=2;


がおこなわれたときの


2のまま変化することはなく


2となります


いままでの結果をまとめると



         🍓自作関数の引数となっている変数bに🍓


      

          🍓どのような変数が代入されても🍓


(同じ変数名である

プログラムの冒頭で変数宣言された

グローバル変数b

もしくは

main関数内で変数宣言されたローカル変数b


あるいは別の変数名である

プログラムの冒頭で変数宣言された

グローバル変数a

もしくは

main関数内で変数宣言されたローカル変数a


など、どのような変数が代入されても)


その変数に格納されている値だけが


自作関数の引数となっている変数bにわたされます。


つまり


       値渡しが


行われます。」



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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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