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