初期化

提供: Appmethod Topics
移動先: 案内検索

宣言構文:インデックス への移動


初期化子は、オブジェクト(変数、配列、構造体など)に格納される初期値を設定するものです。オブジェクトは、初期化されず静的な存続期間を持つ場合、デフォルトで以下の値に初期化されます。

  • 算術型の場合はゼロ
  • ポインタ型の場合はヌル ポインタ

メモ: 自動記憶域期間を持つオブジェクトの場合、値は不定です。

初期化子の構文


initializer
	= expression
	= {initializer-list} <,>}
	(expression list)
initializer-list
	expression
	initializer-list, expression
	{initializer-list} <,>}

初期化子を規定する規則

  • 初期化子リスト内の初期化子の数は、初期化されるオブジェクトの数を上回ってはいけません。
  • 初期化される項目は、オブジェクト(配列など)でなければなりません。
  • C では、すべての式は、以下のいずれかに現れる場合は定数でなければなりません(C++ では、その必要はありません)。
    • 静的な存続期間を持つオブジェクトの初期化子の中
    • 配列、構造体、共用体の初期化子リストの中(sizeof を使用する式も許されます)
  • 識別子の宣言がブロック スコープを持ち、その識別子が外部リンケージまたは内部リンケージを持つ場合は、その宣言に識別子の初期化子があってはいけません。
  • 中かっこで囲まれたリスト内の初期化子が構造体のメンバよりも少ない場合、構造体の残りのメンバは、静的記憶域期間を持つオブジェクトと同じように暗黙に初期化されます。

スカラ型はただ 1 つの式で初期化されますが、その式を中かっこで囲んでもかまいません。そのオブジェクトの初期値は、その式の値になります。この場合も、単純な代入の場合と同様に型と変換の制約が適用されます。

共用体の場合、中かっこで囲まれた初期化子は、共用体の宣言リストに最初に現れたメンバを初期化します。自動記憶域期間を持つ構造体または共用体の場合、初期化子は以下のいずれかでなければなりません。

  • 初期化子リスト(詳細は、以下の「配列、構造体、共用体」で説明)。
  • 構造体または共用体の型と互換性のある単一の式。この場合、オブジェクトの初期値はその式の値になります。

配列、構造体、共用体

配列と構造体については、中かっこで囲まれた初期化子リストを使って、当該オブジェクトの要素またはメンバを(必要であれば宣言時に)初期化します。配列の場合は添字が小さい順に、構造体の場合はメンバ順に、それぞれ初期化子が指定されます。共用体の場合は、中かっこで囲まれた初期化子で最初のメンバが初期化されます。たとえば、1 か月の間に各曜日が何日あるかを数える配列 days(各曜日は最低 1 日あると仮定する)は、次のように宣言することができます。

 int days[7] = { 1, 1, 1, 1, 1, 1, 1 }

文字配列とワイド文字配列の初期化は、以下の規則に従います。

  • 文字型の配列は、リテラル文字列(中かっこで囲んでもかまわない)で初期化することができます。文字列内の各文字(末尾の NULL 文字も含む)で、配列内の連続した要素が初期化されます。たとえば、以下の宣言を行うと、
 char name[] = { "Unknown" };
8 個の要素から成る配列がセットアップされ、その要素は 'U'(name[0] に対応)、'n'(name[1] に対応)などになります(文字列末尾の NULL 文字も含まれます)。
  • ワイド文字配列(wchar_t と互換のもの)は、ワイド文字列リテラル(中かっこで囲んでもかまわない)を使って初期化することができます。文字配列の場合と同様に、ワイド文字列リテラルのコードで、配列の連続した要素が初期化されます。

構造体の初期化の例を以下に示します。

 struct mystruct {
    int i;
    char str[21];
    double d;
    } s = { 20, "Borland", 3.141 };

複雑な構造体メンバ(たとえば配列や構造体など)の初期化は、ネストされた中かっこ内に適切な式を記述することで行えます。

関連項目