関数ブロックの外で変数を定義すれば、その変数は定義したところからプログラムソースファイルの最後まで(大域的)スコープ(有効範囲)を持ちます。
以下のプログラムを実行したときに、その出力は、のようになります。このとき、address of i (in main) lval_1 = ADDRESS1 value of i (in main) val_1 = VALUE1 address of i (in test) lval_2 = ADDRESS2 value of i (in test) val_2 = VALUE2 value of i (in test) val_3 = VALUE3 value of i (in main) val_4 = VALUE4Q1: ADDRESS1 と ADDRESS2 は等しくなりますか?なお、下のプログラムで変換文字%pは、変数のメモリアドレスの表示に用いられるものです。
Q2: VALUE1, VALUE2, VALUE3, VALUE4 の値はどうなりますか?
- (a)プログラムリスト
#include <stdio.h> void test(void); int i; int main(void) { i = 10; /* main() における変数 i の記憶場所の表示 */ printf("address of i (in main) lval_1 = %p\n",&i); /* main() 内 における変数 i の値の表示 */ printf("value of i (in main) val_1 = %d\n",i); test(); printf("value of i (in main) val_4 = %d\n",i); } void test(void) { /* 関数 test() 内 における変数 i の記憶場所の表示 */ printf("address of i (in test) lval_2 = %p\n",&i); /* 関数 test() 内 における変数 i の値の表示 */ printf("value of i (in test) val_2 = %d\n",i); i = 20; printf("value of i (in test) val_3 = %d\n",i); }
- (b)結果
- Q1の答え:
- ADDRESS1 と ADDRESS2は値(記憶番地)は同じ値を持つ。
- Q2の答え:
- VALUE1 = 10
VALUE2 = 10
VALUE3 = 20
VALUE4 = 20
※実際にプログラムを実行して確かめてみよう。