グローバル変数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));

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


return 0;

}


コンパイル結果

3

2


アレサ

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


main関数内で変数宣言され


作製された


ローカル変数bを


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


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


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


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


そのときも


ローカル変数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));

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


return 0;

}


コンパイル結果

3

2



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


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


自作関数内で変数宣言された


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


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


自作関数内で変数宣言された


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


同様に機能し


グローバル変数b

ローカル変数b


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


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

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


が2つ


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


ですから


グローバル変数b

ローカル変数b


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


グローバル変数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)

自作関数に代入されて


自作関数の定義の


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;

}


ソーラー

「このプログラムでは


自作関数内で記述されている変数bは


ローカル変数bで


プログラムの冒頭で記述されている変数bは


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


そして


そのグローバル変数bを自作関数内の引数となっている


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



このとき


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


2

なのでしょうか


3なのでしょうか?


さすがにこの状態で


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


f(b)


のように代入された


グローバル変数bは


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


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


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


自作関数の引数内で記述されている変数bは


ローカル変数bで


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


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


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



グローバル変数bを


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


と代入しても


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


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


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



なぜなら


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



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


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


よって


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


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


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


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


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


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


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


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


2のまま変化しません


ですので


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


の命令文により表示される結果は


int b=2;のまま変化せず


2となります


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



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


      

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


(同じ変数名である

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

グローバル変数b

もしくは

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


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

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

グローバル変数a

もしくは

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


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


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


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


つまり


       値渡しが


行われます。」



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

作者を応援しよう!

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

応援したユーザー

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