スカラー型の初期化
スカラー型を初期化する場合は、 assignment-expression の値が変数に代入されます。 代入の変換規則が適用されます (変換規則については、「型変換」を参照)。
構文
declaration:
declaration-specifiersinit-declarator-listopt;
declaration-specifiers:
storage-class-specifierdeclaration-specifiersopt
type-specifierdeclaration-specifiersopt
type-qualifierdeclaration-specifiersopt
init-declarator-list:
init-declarator
init-declarator-list , init-declarator
init-declarator:
declarator
declarator=initializer /* スカラーの初期化の場合 */
initializer:
assignment-expression
次の規則に従って、あらゆる型の変数を初期化できます。
ファイル スコープ レベルで宣言された変数は初期化できます。 外部レベルで明示的に変数を初期化しない場合、既定で 0 に初期化されます。
staticstorage-class-specifierを指定して宣言されたすべてのグローバル変数は、定数式を使用して初期化できます。staticとして宣言された変数は、プログラムの実行開始時に初期化されます。 グローバルstatic変数を明示的に初期化しない場合は、既定で 0 に初期化され、ポインター型を持つすべてのメンバーに null ポインターが割り当てられます。autoまたはregisterのストレージクラス指定子によって宣言された変数は、それらの変数が宣言されたブロックに実行制御が渡されるたびに初期化されます。 変数autoまたはregisterの宣言で初期化子を省略すると、変数の初期値が未定義になります。 自動値とレジスタ値では初期化子が定数に限定されていないため、定義済みの値や関数呼び出しを含む任意の式を指定できます。外部変数の宣言の初期値およびすべての
static変数 (外部変数または内部変数) の初期値は、定数式である必要があります (詳細については、「定数式」を参照)。外部宣言された変数または静的変数のアドレスは定数であるため、内部宣言されたstaticポインター変数の初期化に使用できます。 ただし、auto変数のアドレスは、ブロックの実行ごとに異なる可能性があるため、静的初期化子として使用できません。 変数autoとregisterの初期化には、定数値または変数値のいずれも使用できます。識別子の宣言にブロック スコープが存在し、識別子に外部リンケージがある場合、宣言に初期化を含めることはできません。
使用例
次の例では初期化を示します。
int x = 10;
整数変数 x は定数式 10 に初期化されます。
register int *px = 0;
ポインター px は 0 に初期化され、"null" ポインターが作成されます。
const int c = (3 * 1024);
この例では定数式 (3 * 1024) を使用し、 const キーワードによって c を変更できない定数値に初期化します。
int *b = &x;
このステートメントは、b を別の変数 x のアドレスで初期化します。
int *const a = &z;
ポインター a が z という名前の変数のアドレスで初期化されます。 ただし、変数 a は const と指定されているため、初期化はできますが変更はできません。 これは、常に同じ場所を指します。
int GLOBAL ;
int function( void )
{
int LOCAL ;
static int *lp = &LOCAL; /* Illegal initialization */
static int *gp = &GLOBAL; /* Legal initialization */
register int *rp = &LOCAL; /* Legal initialization */
}
グローバル変数 GLOBAL は外部レベルで宣言されるため、グローバル有効期間があります。 ローカル変数 LOCAL には auto ストレージ クラスがあり、このローカル変数を宣言する関数の実行中のみアドレスが存在します。 したがって、 static ポインター変数 lp を LOCAL のアドレスで初期化することはできません。 GLOBAL のアドレスは常に同じであるため、 static ポインター変数 gp をこのアドレスに初期化できます。 同様に、rp がローカル変数であり、定数でない初期化子を指定できるため、*rp は初期化できます。 ブロックが入力されるたびに LOCAL に新しいアドレスが割り当てられ、それが rp に割り当てられます。