記憶クラスと通用範囲
オブジェクト(変数)は、
- 型:オブジェクト(変数)が持っている値の意味
- 記憶クラス:オブジェクト(変数)が格納されている場所の寿命
という2つの属性を持っている。
名前(識別子)は、
- 通用範囲:その識別子の性質が理解されているプログラムの領域
を持つ。
記憶クラスには、
- 自動的(auto):宣言されたブロックに局所的(local)で、ブロックに入る時に自動的に創られ、そのブロックから出ると捨てられてしまう
- 静的(static):関数やブロックから出たり入ったりする間も値が保持される
の2種類ある。
- 自動変数:宣言されたブロック内
- 関数の引数:宣言された関数内
- 外部変数、関数:ファイルで宣言された点からファイルの終わりまで
static宣言がない場合は、他のファイルからも参照できる(外部リンケージ)
- static宣言はその通用範囲をソースファイルの残りの部分に限定する(内部リンケージ)
- 外部変数が定義される前に参照されたり、異なるソースファイルで定義されている場合は、extern宣言が必要
変数の宣言場所と記憶クラス/通用範囲
記憶クラス 指定子 | 宣言場所 |
ブロック内(先頭) | ブロック外 |
static | 静的/ブロック内 | 静的/ファイル内 |
auto register | 自動的/ブロック内 | - |
なし | 静的/全域 |
extern | 静的/全域 |
記憶クラス | 静的 | 自動的 |
初期化の タイミング |
プログラムの開始時に1回だけ | プロックが実行される度に |
初期化あり |
定数式でなければならない | { リスト } の場合は定数式でなければならない |
初期化なし |
ゼロに初期化される | 値は不定(ゴミ)となる |
- 変数定義の後ろに =初期値式; を書く
- 配列、構造体、共用体の初期化は = { 定数式のリスト }; である
記憶クラスと通用範囲の練習問題へ