教科書P182〜193
変数は関数内で定義(宣言)し、関数内でのみ有効。
[例]
#include <stdio.h> /* プロトタイプ宣言 */ void sub(void); void main(void) { int a = 10; printf("main関数のa = %d\n", a); sub(); } void sub(void) { int a = 0; printf("sub関数のa = %d\n", a); }《実行結果》
main関数のa = 10
sub関数のa = 0※main関数で宣言した変数aとsub関数で宣言した変数aは「別物」である!!
Q:main関数で宣言した変数aの値をsub関数で表示するには?
A:sub関数に引数として渡す
[解答例1]
#include <stdio.h> /* プロトタイプ宣言 */ void sub(int); void main(void) { int a = 10; printf("main関数のa = %d\n", a); sub(a); } void sub(int a) { printf("sub関数のa = %d\n", a); }《実行結果》
main関数のa = 10
sub関数のa = 10[解答例2]
#include <stdio.h> /* プロトタイプ宣言 */ void sub(int *); void main(void) { int a = 10; printf("main関数のa = %d\n", a); sub(&a); } void sub(int *a) { printf("sub関数のa = %d\n",*a); }《実行結果》
main関数のa = 10
sub関数のa = 10
関数内で宣言する変数の前に
staticを付けると、関数が終わっても開放されずに残るため、値を保持することができる。
この変数を静的変数と呼ぶ。[例]
#include <stdio.h> /* プロトタイプ宣言 */ void sub(void); void main(void) { sub(); sub(); sub(); sub(); sub(); } void sub(void) {staticint a = 0; a++; printf("a = %d\n", a); }《実行結果》
a = 1
a = 2
a = 3
a = 4
a = 5[プログラムの流れ]
- 最初にsub関数が呼ばれると、メモリ内にint型の長さを持つ変数aの領域が確保され、初期値として0が格納される。
- sub関数終了時、通常の変数はメモリから開放されるが、変数aは
staticで宣言されているため、開放されずに残る。- 2度目にsub関数が呼ばれると、変数aを宣言しようとするが、
既にメモリ上に確保されてるため、何もしない。- プログラム終了時、全ての変数が開放される。
[注意]
静的変数として使う場合、変数宣言時に初期値を代入しなければならない。
#include <stdio.h> /* プロトタイプ宣言 */ void sub(void); void main(void) { sub(); sub(); sub(); sub(); sub(); } void sub(void) {staticint a;a = 0;a++; printf("a = %d\n", a); }《実行結果》
a = 1
a = 1
a = 1
a = 1
a = 1変数aの領域は確保されたままだが、関数が呼ばれるたびに0が代入されてしまう。
変数は
関数の外で定義(宣言)することができる。関数の外で宣言した変数は、そのソース内の全ての関数で使うことができる。
この変数をグローバル変数と呼ぶ。[例]
#include <stdio.h> /* グローバル変数 */int a;/* プロトタイプ宣言 */ void sub(void); void main(void) { a = 0; sub(); printf("main関数から a = %d\n", a); sub(); } void sub(void) { a++; printf("sub関数から a = %d\n", a); }《実行結果》
sub関数から a = 1
main関数から a = 1
sub関数から a = 2
C言語は複数のソースファイルを結合(リンク)して1つのプログラムを作ることができる。この際、
複数のソースファイル内で共通に使う変数を宣言することができる。
この変数を外部変数と呼ぶ。[例]
《ソース1》 #include <stdio.h> /* 外部変数(元) */int a;/* 外部関数のプロトタイプ宣言 */void sub(void);void main(void) { a = 0; sub(); a += 10; printf("main関数で a = %d\n", a); } 《ソース2》 #include <stdio.h> /* 外部変数 */extern int a;/* プロトタイプ宣言 */ void sub(void); void sub(void) { a = 10; printf("sub関数で a = %d\n", a); }《実行結果》
sub関数で a = 10
main関数で a = 20[POINT]
- 外部変数は複数のソース内のどこか1箇所で宣言する。
- 宣言したソース以外のソースで利用する場合、
externを付けて同じ名前の変数を宣言する。(Windowsのショートカットのようなイメージ)
複数のソースを組み合わせて1つのプログラムを作る場合、ソース内でのみ使う関数や変数、各ソース共通で使う関数や変数を区別するため、次のようにプログラミングすることが望ましい。
[例]
《ソース1》 #include <stdio.h> /* 外部変数(元) */ int a; /* グローバル変数 */staticint b; /* 外部関数のプロトタイプ宣言 */ void sub1(void); /* プロトタイプ宣言 */staticvoid out(int); void main(void) { a = 0; sub1(); a += 10; out(a); }staticvoid out(int a) { printf("%d", a); } 《ソース2》 #include <stdio.h> /* 外部変数 */extern int a;/* プロトタイプ宣言 */ void sub1(void);staticvoid sub2(void); void sub1(void) { a = 10; printf("sub関数で a = %d\n", a); }staticvoid sub2(void) { ・ ・ ・ }[POINT]
- ソース内でしか使わない関数、グローバル変数は
staticを付けて宣言する。- ほかのソースでも使う関数(外部関数)、外部変数はそのまま宣言する。