🌞自作関数6 💃ローカル変数とは ある関数の中で定義された変数のことです

ソーラー「さあ、どんどんいくぞっ


プロトタイプ宣言の次は・・・


ローカル変数だ!


関数の自作ができるようになったので


ローカル変数の説明もできるようになったんだ。


とりあえず


ローカル変数の説明もできるようになったんだけど


ローカル変数がどういうものなのかは


だんだんとわかってくると思うな。


(参照渡し、値渡しの エピソードでさらに詳しく理解できます)


ひとまず


          💃ローカル変数とは🐙


    🍅ある関数のブロック{}内で定義された変数🍅



のことなんだよ。


どういうことかというと


次のプログラムをみてみようよ。


🍓🍓🍓🍓🍓

#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);

}


と

自作関数の定義が記述されています。


______________________________

ここで自作関数の定義のブロック{}内に


int a=1;


をもってきました。


int a=1; とaの変数宣言と初期化をしているところが


ミソだね。 ふふっ ここで変数aを仕込んできましたよ(^^)

______________________________



そして


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();


と記述されます


もしvoid f(int x)タイプの自作関数なら


main関数内で呼び出して使用するときは


f(x);


と記述されます


🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋


このプログラムは


普通に 自作関数をつかったプログラムだね。


ここまではいいかな?」


アレサ「はいっ ここまでは今までどおり普通です。」


ソーラー「では 次のプログラムをコンパイルすると


どのような結果になるかな~\(^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をとりこみました。",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」が定義されていません。

名前が間違っていないかどうか確認してください。ですか・・・


一番最初の🍓🍓🍓🍓🍓のプログラムでは


普通にコンパイル結果は


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で共有
  • はてなブックマークでブックマーク

作者を応援しよう!

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

応援したユーザー

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