🌞自作関数6 💃ローカル変数とは ある関数の中で定義された変数のことです
ソーラー「さあ、どんどんいくぞっ
プロトタイプ宣言の次は・・・
ローカル変数だ!
関数の自作ができるようになったので
ローカル変数の説明もできるようになったんだ。
ここまできた~
とりあえず
ローカル変数の説明もみんなにできるようになったんだけど
ローカル変数がどういうものなのかは
だんだんと、だんだんと
わかってくると思うな。
(参照渡し、値渡しの エピソードでさらに詳しく理解できます)
ひとまず
💃ローカル変数とは🐙
🍅ある関数のブロック{}内で変数宣言、定義された変数🍅
のことなんだよ。
どういうことかというと
次のプログラムをみてみようよ。
(1番目のプログラム)
🍓🍓🍓🍓🍓
#include <stdio.h>
void f(void){
int a=1;
printf("%dをとりこみました。\n",a);
}
int main(void)
{
f();
return 0;
}
プログラムの実行結果
1をとりこみました。
🍓🍓🍓🍓🍓
このプログラムでは
int main(void){ } (👈メイン関数)より前に
void f(void){
int a=1;
printf("%dをとりこみました。\n",a);
}
と
自作関数fの定義が記述されています。
______________________________
ここで自作関数fの定義のブロック{}内に
int a=1;
をもってきました。
int a=1; とaの変数宣言と初期化をしているところが
ミソだね。 ふふっ ここで変数aを仕込んできましたよ(^^)
______________________________
そして
main関数の記述をよ~くみてね
👇
int main(void)
{
f();
return 0;
}
👆
int main(void){}(メイン関数)のなかで
自作関数fを
f();
と呼び出してつかっているね。
プログラムを実行すると
プログラムの実行結果は
1をとりこみました。
となります。
🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋
このように自作関数void f(void)を
main関数のブロック{}内で呼び出して使用するときは
f();
と記述します
数値を格納するための変数を引数として持っていないので
自作関数void f(void)と()の中はvoidになっているんだったね。
?
今のプログラムの場合
(自作関数の定義内に)変数なら 変数aがあるじゃない?とおもわれるかもしれませんが
自作関数
void f(void){
int a=1;
printf("%dをとりこみました。\n",a);
}
は
自作関数
void f(void){
printf("%dをとりこみました。\n",1);
}
と 同等なのです
自作関数
void f(void){
printf("%dをとりこみました。\n",1);
}
が数値を受け取る変数aを引数にもたないのと同様に
自作関数の定義
void f(void){
int a=1;
printf("%dをとりこみました。\n",a);
}
は
数値を受け取る変数aを引数にもたないというわけです
よって
この自作関数fの定義では
数値を受け取る変数が使われていないため
void f(void)と記述されています
void f(int a)とはなりません。
このvoid f(void)と記述された
自作関数fをmain関数内で呼び出して使用するときは
f();
と記述します
もし
自作関数fの定義が
void f(int x){
printf("%dをとりこみました。\n",x);
}
のような
void f(int x)タイプの自作関数なら
main関数のブロック{}内で呼び出して使用するときは
int xに1を代入したい場合は
f(1);
のように記述します
🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋
ソーラー「
このプログラムは
普通に 自作関数をつかったプログラムだね。
ここまではいいかな?」
アレサ「はいっ ここまでは今までどおり普通です。」
ソーラー「では 次のプログラムを実行すると
どのような結果になるかな~\(^o^)/?
#include <stdio.h>
void f(void){
int a=1;
printf("%dをとりこみました。\n",a);
}
int main(void)
{
f();
printf("%dをとりこみました。\n",a);//👈ここに注目 命令文が追加されています
return 0;
}
アレサ 「このプログラムは
自作関数f();を実行したあとで
printf("%dをとりこみました。\n",a);
を実行するプログラムなのですね。」
ソーラー 「そう😊
アレサ このプログラムの実行結果は
どうなると思う、思う(^^)/」
アレサ 「
int main(void){}(メイン関数)のブロック{}のなかで
f();
printf("%dをとりこみました。\n",a);
が実行されるのですから
プログラムの実行結果は
1をとりこみました。
1をとりこみました。
となるのではないですか?」
ソーラー「おおぅ・・・ぼけてる・・ちゃんと」
アレサ 「え?
プログラムの実行結果は
1をとりこみました。
1をとりこみました。
にならないのですか?」
ソーラー『正解は
次のようなビルドエラーがでるんだ。
ファイル「C:/Users/solarple/AppData/Local/EasyIDEC/project/my function/main.c」の
「10行目」で記述エラーを発見しました。
「a」が定義されていません。
名前が間違っていないかどうか確認してください。」
アレサ「「a」が定義されていません。
名前が間違っていないかどうか確認してください。ですか・・・
一番最初の🍓🍓🍓🍓🍓マークちゃんのプログラム
🍓🍓🍓🍓🍓
#include <stdio.h>
void f(void){
int a=1;
printf("%dをとりこみました。\n",a);
}
int main(void)
{
f();
return 0;
}
プログラムの実行結果
1をとりこみました。
🍓🍓🍓🍓🍓
では
普通にプログラムの実行結果は
1をとりこみました。と表示されたのに
不思議ですね。」
ソーラー 「そう これが ローカル変数なんです。
つまり
自作関数f();のなかで変数宣言、初期化された変数aは
別の関数であるmain関数の内部では使用できないんだ。
だから
main関数のなかで、ただ単に
printf("%dをとりこみました。\n",a);と記述しただけでは
main関数のなかで
aの変数宣言がおこなわれていないことになり
コンピュータは変数aを認識できず、ビルドエラーになるんだね。
だから 今のプログラムは
次のプログラムのように
自作関数内での変数宣言a、初期化とは別に
main関数内でaの変数宣言と初期化を行う必要があります
#include <stdio.h>
void f(void){
int a=1;
printf("%dをとりこみました。\n",a);
}
int main(void)
{
int a=1;//👈ここです
f();
printf("%dをとりこみました。\n",a);
return 0;
}
プログラムの実行結果
1をとりこみました
1をとりこみました
アレサ「不思議な仕組みですね。」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます