🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
実引数と仮引数とは?実引数から仮引数への値渡しとはなんのことでしょうか? 今度はメモリに電荷が蓄えられるという視点からお話してみたいと思います その3
実引数と仮引数とは?実引数から仮引数への値渡しとはなんのことでしょうか? 今度はメモリに電荷が蓄えられるという視点からお話してみたいと思います その3
てんC「では次のプログラムを
ご覧ください。」
#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
てんC「
main関数は自作関数newmadefunctionを呼ぶ側で
自作関数newmadefunctionはmain関数に呼ばれる側ですね
このとき
呼ぶ側のmain関数内で変数宣言された
変数aは実引数
呼ばれた側の自作関数内で変数宣言された
変数xは仮引数とよばれます
🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅
ですから
今のプログラムのように
main関数内で
aの変数宣言、初期化
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増加しているだけだからです。
このように
main関数内で変数宣言された変数aを
自作関数内で変数宣言された変数xに代入しても
main関数内で変数宣言された変数aに格納されている値だけを
自作関数内の変数xに渡すように
システムは構成されており
このように値だけを渡す方法を
(呼んだ方のmain関数から呼ばれた方の自作関数へ値を渡す方法
あるいは
実引数aから仮引数xへ値を渡す方法を)
🐥値渡し🐥
といいます。」
てんC「このことを
メモリでどのようなことが起こっているか
という
観点から
お話してみたいと思います。
このプログラムが実行されると
👇
#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
てんC「
aの変数宣言、初期化
int a=1;
により
あるメモリに変数aと名前がつけられます。
そして
そのメモリに1というデータが格納されることになります。
次に
newmadefunction(a);
が実行されると
自作関数の定義
👇
void newmadefunction(int x)
{
x = x + 5;
cout << x << "\n";
}
👆
により
まず
int x
の変数宣言が行われます。
このとき
あるメモリに変数xと名前がつけられます。
この時点で
変数aと名前を付けられたメモリと
変数xと名前を付けられたメモリの
2つのメモリが存在することになります
ところで
newmadefunction(a);
のように
int xに
変数aが代入されるわけですが
メモリは機械なので(笑)
当然のことですが・・・」
ソーラー「あっ!わかった!
変数aと名前を付けられたメモリを
変数xと名前を付けられたメモリに
ねじこんでいるわけではないんだね。」
マックス「変数aと名前を付けられたメモリを
変数xと名前を付けられたメモリに
ぶっこんでいるわけではないんだな。」
てんC「その通りです マックスさん、ソーラーさん
int xに
変数aが代入されると
変数aと名前を付けられたメモリに格納されているデータ(電荷)
が
変数xと名前を付けられたメモリに格納されることになります。
(変数xと名前を付けられたメモリに変数aと名前を付けられたメモリに格納されている電荷と等しい量の電荷が蓄えられることになります)
もちろん
変数aと名前を付けられたメモリ
変数xと名前を付けられたメモリ
ともに存在していることになります。
そして
変数aと名前を付けられたメモリに数値データ1が格納されていたので
(数値データ1に相当する電荷が蓄えられていたので)
変数xと名前を付けられたメモリにも数値データ1が格納されることになります
(数値データ1に相当する電荷が蓄えられることになります)
次に
自作関数の定義
void newmadefunction(int x)
{
x = x + 5;
cout << x << "\n";
}
の
x=x+5;
が実行されます
これは
変数xという名前の付いたメモリに格納されている数値データに5を加えよ
という命令文ですので
変数xという名前の付いたメモリに格納される数値データは1から6になります
(数値データ6に相当する電荷が蓄えられます)
そして
cout << x << "\n";
が実行されると
変数xという名前の付いたメモリに格納されている数値データ6が
コマンドプロンプト画面に表示されることになります
ここでも
当然のことですが
変数xと名前を付けられたメモリ
と
変数aと名前を付けられたメモリ
は
独立したメモリなので
変数xという名前の付いたメモリに格納されている数値データが6になっても
変数aと名前を付けられたメモリに格納されている数値データは1のままですね
ですから
cout << a << "\n";
が実行されたならば
変数aと名前を付けられたメモリに格納された数値データ1が
コマンドプロンプト画面に表示されることになります
コマンドプロンプト画面に6が表示されることはありません。」
ソーラー「わお ほんとだ
このプログラムを
頭で追って考えると」
#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
ソーラー「自作関数の定義
void newmadefunction(int x)
{
x = x + 5;
cout << x << "\n";
}
により
int xにaが代入されると
a=a+5;
printf("%d\n",a);
がおこなわれて
変数aに格納される値は6となり
コマンドプロンプト画面に6が表示されると
思っちゃうけど
メモリにデータが格納されるという観点から考えると
そのようなことが起こらないのがわかるね」
てんC「はい😊 これが値渡しと呼ばれる状態ですが
とても普通のことが行われているのですね。」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます