🌞自作関数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をとりこみました



アレサ「不思議な仕組みですね。」



  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る