Sdílet prostřednictvím


Inicializace typů agregace

Typ "agregace" je struktura, sjednocení nebo typ pole.Pokud agregační typ obsahuje členy agregačních typů, uplatňují se pravidla inicializace rekurzivně.

Syntax

  • Inicializátor:
    { seznam inicializátorů } / * Pro inicializaci agregace * /

    { seznam inicializátorů , }

  • seznam inicializátorů:
    Inicializátor

    seznam inicializátorů , inicializátor

Seznam inicializátorů je seznam inicializátorů oddělených čárkami.Každý inicializátor v seznamu je konstantní výraz nebo seznam inicializátorů.Proto mohou být seznamy inicializátorů vnořené.Tento způsob je vhodný pro inicializaci agregovaných členů agregačního typu, jak je uvedeno v příkladech v tomto oddílu.Pokud je však inicializátor pro automatický identifikátor jednoduchým výrazem, nemusí být konstantním výrazem. Musí pouze mít vhodný typ pro přiřazení k identifikátoru.

Pro každý seznam inicializátorů jsou hodnoty konstancích výrazů přiřazeny v pořadí odpovídající členům agregační proměnné.

Pokud má seznam inicializátorů méně hodnot než agregační typ, jsou zbývající členové nebo prvky agregačního typu inicializovány na hodnotu 0.Počáteční hodnota automatického identifikátoru, který nebyl explicitně inicializován, není definována.Pokud má seznam inicializátoru více hodnot než agregační typ, dojde k chybě.Tato pravidla platí pro každý vložený seznam inicializátorů, stejně jako pro agregační typ, jako celek.

Inicializátor struktury je výraz stejného typu nebo seznam inicializátorů svých členů uzavřených do složených závorek ({ }).Nepojmenovaní členové bitového pole nejsou inicializováni.

Při inicializaci sjednocení musí být seznam inicializátorů výraz jedné konstanty.Hodnota výrazu konstanty je přiřazena k prvnímu členu sjednocení.

Má-li pole neznámou velikost, určuje počet inicializátorů velikost pole a jeho typ je dokončen.V jazyce C neexistuje žádný způsob zadání inicializátoru nebo inicializace prvku uprostřed pole, aniž by byly poskytnuty také předchozí hodnoty.Pokud je tuto operaci třeba provést v rámci aplikace, je třeba napsat rutinu v jazyce sestavení.

Všimněte si, že počtem inicializátorů lze nastavit velikost pole:

int x[ ] = { 0, 1, 2 }

Nicméně zadáním velikosti s nesprávným počtem inicializátorů vygeneruje kompilátor chybu.

Specifické pro Microsoft

Maximální velikost pole je definována pomocí size_t.size_t, definované v záhlaví souboru STDDEF.H je unsigned int s rozsahem 0x00000000 až 0x7CFFFFFF.

Specificka produktu Microsoft END

Příklady

Tento příklad ukazuje inicializátory pole.

int P[4][3] = 
{
    { 1, 1, 1 },
    { 2, 2, 2 },
    { 3, 3, 3,},
    { 4, 4, 4,},
};

Tento příkaz deklaruje P jako pole s rozměrem čtyři krát tři a inicializuje prvky jeho prvního řádku na 1, prvky jeho druhého řádku na 2 a tak dále, až do čtvrtého řádku.Všimněte si, že seznam inicializátorů obsahuje u třetího a čtvrtého řádku za posledním výrazem konstanty čárky.Poslední seznam inicializátorů ({4, 4, 4,},) je také následován čárkou.Tyto čárky jsou povoleny, ale nejsou požadovány. Požadovány jsou pouze čárky oddělující výrazy konstant a ty, které oddělují seznamy inicializátorů.

Pokud nemá agregační člen žádný vložený seznam inicializátorů, hodnoty jsou jednoduše přiřazeny podle pořadí každého člena podřízeného agregačního člena.Proto inicializace v předchozím příkladu odpovídá následujícímu:

int P[4][3] = 
{
   1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4
};

Složené závorky mohou být použity u jednotlivých inicializátorů v seznamu a mohou napomáhat objasnění příkladu uvedeného výše.

Při inicializaci agregované proměnné je třeba používat složené závorky a seznamy inicializátorů správně.Následující příklad ukazuje podrobnější interpretaci složených závorek kompilátorem:

typedef struct 
{
    int n1, n2, n3;
} triplet;

triplet nlist[2][3] = 
{
    { {  1, 2, 3 }, {  4, 5, 6 }, {  7, 8, 9 } },  /* Row 1 */
    { { 10,11,12 }, { 13,14,15 }, { 16,17,18 } }   /* Row 2 */
};

V tomto příkladu je nlist deklarován jako pole struktur o rozměru dva krát tři, kde každá struktura obsahuje tři členy.Řádek 1 inicializace přiřadí hodnoty prvnímu řádku nlist takto:

  1. První levá složená závorka na řádku 1 oznamuje kompilátoru začátek inicializace prvního agregačního členu nlist (což je nlist[0]).

  2. Druhá levá závorka označuje začátek inicializace prvního agregačního člena nlist[0] (což je struktura na nlist[0][0]) je začátek.

  3. První pravá složená závorka ukončí inicializaci struktury nlist[0][0]. Další levá složená závorka spustí inicializaci nlist[0][1].

  4. Proces pokračuje až na konec řádku, kde pravá složená závorka vpravo zakončí inicializaci nlist[0].

Řádek 2 přiřadí hodnoty do druhého řádku nlist podobným způsobem.Všimněte si, že jsou požadovány vnější sady závorek obsahují inicializátory na řádku 1 a 2.Následující konstrukce, která vynechává vnější složené závorky by způsobila chybu:

triplet nlist[2][3] =  /* THIS CAUSES AN ERROR */
{
     {  1, 2, 3 },{  4, 5, 6 },{  7, 8, 9 },   /* Line 1 */
     { 10,11,12 },{ 13,14,15 },{ 16,17,18 }    /* Line 2 */
};

V této konstrukci spouští první levá složená závorka v řádku 1 inicializaci nlist[0], což je pole tří struktur.Hodnoty 1, 2 a 3 jsou přiřazeny třem členům první struktury.Po další pravé složené závorce (po hodnotě 3), je inicializace nlist[0] dokončena a zbývající dvě struktury v poli o třech strukturách jsou inicializovány hodnotou 0.Podobně { 4,5,6 } inicializuje první strukturu v druhém řádku nlist.Zbývající dvě struktury nlist[1] jsou nastaveny na hodnotu 0.Jakmile kompilátor narazí na další seznam inicializátorů ( { 7,8,9 } ), pokusí se o inicializaci nlist[2].Jelikož má nlist pouze dva řádky, způsobí tento pokus chybu.

V dalším příkladu jsou tři členové intx inicializováni v pořadí 1, 2 a 3.

struct list 
{
    int i, j, k;
    float m[2][3];
} x = {
        1,
        2,
        3,
       {4.0, 4.0, 4.0}
      };

Ve struktuře list uvedené výše, jsou tři prvky v prvním řádku m inicializovány na hodnotu 4.0. Prvky zbývajícího řádku m jsou ve výchozím nastavení inicializovány na hodnotu 0.0.

union
{
    char x[2][3];
    int i, j, k;
} y = { {
            {'1'},
            {'4'} 
        }
      };

V tomto příkladu je inicializována proměnná sjednocení y.První prvek sjednocení je pole, a tedy je inicializátor agregační inicializátor.Seznam inicializátorů {'1'} přiřadí hodnoty prvnímu řádku pole.Vzhledem k tomu, že se v seznamu zobrazí pouze jedna hodnota, je prvek v prvním sloupci inicializován na znak 1 a zbývající dva prvky v řádku jsou ve výchozím nastavení inicializovány na hodnotu 0.Podobně je první prvek druhého řádku x inicializován na znak 4 a zbývající dva prvky v řádku jsou ve výchozím nastavení inicializovány na hodnotu 0.

Viz také

Koncepty

Inicializace