値渡しについてご説明いたします
実引数とは?仮引数とは?実引数から仮引数への値渡しとはなんのことでしょうか?
アレサ
「 先程のプログラムの→
#include <stdio.h>
void newmadefunction(int x)
{
x=x+5;
printf("%d\n",x);
}
int main(void){
newmadefunction(5);
return 0;
}
コンパイル結果
10
アレサ「→
このプログラムの
newmadefunction(5);
の実行においては
自作関数newmadefunctionの定義内の
void newmadefunction(int x)内で
定義されたint xに 数値5が代入されていました
今度は趣向を変えて
自作関数void newmadefunction(int x)のint xに
main関数の中で
変数宣言、初期化された
変数aを代入する
newmadefunction(a);
を実行してみたいと思います」
ソーラー「たのむよ~~~🌞🌞🌞 アレサ~~~」
#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
🍓 🍓 🍓 🍓 🍓 🍓 🍓 🍓 🍓 🍓 🍓 🍓 🍓
このように自作関数newmadefunction(int x)の
引数であるint xに
main関数内で変数宣言された変数aを代入して
変数aに格納されている数値を渡すことができるよう
C言語では設計されています。
これは素朴ですが とても重要な仕組みなんです
excellent C言語 より
🍓 🍓 🍓 🍓 🍓 🍓 🍓 🍓 🍓 🍓 🍓 🍓 🍓
アレサ
「excellent C言語 さん
ご説明ありがとうございます
それでは
このプログラムの構造はどうなっているのでしょうか
まずはmain関数内で
aの変数宣言
int a=1;
が実行されています
次に
newmadefunction(a);
について考察してみたいと思います。
int xに変数aが代入されています
この場合
🐣int xに変数aが代入されているようにみえる🐦
という言い方が正解ですの
自作関数newmadefunction(int x)のint xに
newmadefunction(a);
と
main関数内で定義された変数aがint xに代入された場合
正確には変数aが代入されたのではなく
💖変数aに格納されている数値データ1だけが💖
int xに代入されています
このように
変数aをint xに代入することにより
変数aに格納されている数値データ1を
自作関数newmadefunction(int x)の
int 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に変数aを代入します*/
return 0;
}
コンパイル結果
6
このプログラムでは
自作関数の定義は次のようになっています
newmadefunction(int x){
x=x+5;
printf("%d\n",x);
}
さきほど述べたように
自作関数newmadefunction(int x)に
newmadefunction(a);と
int xに変数aを代入するということは
int xに変数aに格納されている数値データ1を代入することになります
つまり
int x=1; が実行されたのと同じことになります
その状態で
自作関数newmadefunction内の
x=x+5; が実行されると
変数xに格納されている数値データは6となります。
🍓 🍓
(x=x+5;は変数xに格納されている数値データに5を加えるという命令文ですね
ですので
この場合は変数xに格納されている数値データ1に5が加えられ
変数xに格納されている数値データは6になります)
🍓 🍓
そして
x=x+5;
の
次に記述されている命令文
printf("%d\n",x);
が実行されることにより
コマンドプロンプト画面に
数値データ6がprintf出力表示されます。」
ソーラー「なぁ~るほど~\(^o^)/」
アレサ「
ではでは😊 今のプログラムに
命令文printf("%d\n",a);を付け加えたプログラム
👇
#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を代入します*/
printf("%d\n",a);/*👈この位置に付け加えました*/
return 0;
}
の仕組みを一緒にみていきましょう。ソーラーさん
みなさんも考察してみてください
このプログラムでは
自作関数newmadefunction(a);
の命令文が実行された後
いまの付け加えられた命令文
printf("%d\n",a);
が実行されるのです\(^o^)/
では問題です
コンパイル後
コマンドプロンプト画面に
printf("%d\n",a);が実行され
表示されるのは・・・
1なのですか? 6ですか?
はい、ソーラーさん」
ソーラー「自作関数newmadefunction(a);
では
自作関数の引数であるint xに
変数aに格納されている数値データ1を渡しただけなので
変数aに格納されている数値データは1のまま変化しない
答えは ・・・
アレサ」
アレサ
「ふふ さあ ソーラーさん
コンパイル後の
コマンドプロンプト画面に
printf("%d\n",a);
の実行により
表示されるのは・・・」
ソーラー「TVコマーシャルです。」
アレサ「コマンドプロンプト画面はYou tubeではありません。」
ソーラー「1です これできまりさ」
アレサ 「ピンポ~ん 大正解です。」
ソーラー「やったね!」
アレサ
「はいっ
コマンドプロンプト画面に
printf("%d\n",a);によって
表示されている値は 1 となります
void newmadefunction(int x)
{
x=x+5;
printf("%d\n",x);
}
👆
と定義された自作関数newmadefunctionが実行されるとき
int xに
main関数内で定義された変数aを代入して
変数aに格納されている数値1を
自作関数の引数であるint xに渡したのち
変数xに操作を加えて変数xに格納されている数値を変更したとしも
変数xと変数aは関連がないので
main関数内の変数a(に格納されている数値データ1)は
自作関数の変数xの操作の影響を受けない
のです
🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋
このプログラムでは
main関数のブロック{}内に
newmadefunction(a);
が記述されています
このような状態は
🍋自作関数newmadefunctionは🍋
🍋main関数内に呼ばれて使用されているといえます。🍋
main関数は呼ぶ側で
自作関数newmadefunctionは呼ばれる側ですね
このとき
呼ぶ側の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増加しているだけだからです」
おまけのコーナーです🍰🍰🍰🍰🍰
呼ばれる側の自作関数内で定義された
仮引数である変数xは
次のプログラムでみられるように
自作関数の操作を受け変数xに格納されている値は変化するよう
システムは構成されています
次のプログラムをご覧ください
#include <stdio.h>
void f(void){
int x;
x=1;
x++;
printf("%dをとりこみました。\n",x);
}
int main(void){
f();
return 0;
}
コンパイル結果
2をとりこみました
自作関数f(); が実行されると
変数xに格納されている値は
x++;により
x=1から
x=2に変化しているのがわかります
(余談ですが前のエピソードで確認したように自作関数の実行されてから終了するまで
x=2のデータ情報はコンピュータのメモリに格納されています😊
自作関数の実行が終了すると
変数xに格納されている値は
メモリに名づけられた変数名xとともに
メモリの節約のため消えてしまいます)
🍰🍰🍰🍰🍰
このように
main関数内で定義された変数aを
自作関数で定義された変数xに代入しても
main関数内で定義された変数aに格納されている値だけを
自作関数内の変数xに渡すように
システムは構成されており
このように値だけを渡す方法を
(呼んだ方のmain関数から呼ばれた方の自作関数へ値を渡す方法
あるいは
実引数aから仮引数xへ値を渡す方法を)
🐥値渡し🐥
といいます。」
ソーラー「アレサ
もっとわかりやすく 美しく説明できると思うんだ
🍰🍰🍰🍰🍰
で
かこまれた
🍰コーナーの部分も含めてね
その方がみんなも喜ぶとおもうよ」
アレサ「はいっ😊 ソーラーさん」
ソーラー「
今述べたことを
プログラム上のルールというお話でなく
メモリという機械の観点から述べてみようよ」
アレサ「プログラム上のルールというお話でなく
メモリという機械の観点からですの・・・」
ソーラー「ようはメモリという機械に
電荷が蓄えられるという観点から
今起こっていることを述べてみようってことさ」
アレサ「つまり メモリでどのようなことが起こっているか
ということを述べればよいということですか・・・?」
ソーラー「それ、それ🌞
たのむよ アレサ」
アレサ「かしこまりました」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます