天国にいけるC言語入門 ヘキサ構造体 ver5.2130
グローバル変数bを自作関数の引数となったグローバル変数bに代入した場合も値渡しとなるためグローバル変数bは自作関数の操作を受けることはなくグローバル変数bに格納されている数値は変更されません。
グローバル変数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にわたされます。
つまり
値渡しが
行われます。」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます