Sdílet prostřednictvím


Inicializace skalárních typů

Při inicializaci skalárních assignment-expression typů je hodnota proměnné přiřazena. Platí pravidla převodu pro přiřazení. (Viz Převody typů pro informace o pravidlech převodu.)

Syntaxe

declaration:
declaration-specifiersinit-declarator-listvolit ;

declaration-specifiers:
storage-class-specifierdeclaration-specifiersvolit
type-specifierdeclaration-specifiersvolit
type-qualifierdeclaration-specifiersvolit

init-declarator-list:
init-declarator
init-declarator-list , init-declarator

init-declarator:
declarator
declarator= initializer /* Pro skalární inicializaci */

initializer:
assignment-expression

Proměnné libovolného typu můžete inicializovat, pokud dodržujete následující pravidla:

  • Proměnné deklarované na úrovni oboru souboru lze inicializovat. Pokud proměnnou explicitně neinicializujete na externí úrovni, inicializuje se ve výchozím nastavení na hodnotu 0.

  • Konstantní výraz lze použít k inicializaci jakékoli globální proměnné deklarované pomocí static storage-class-specifier. Proměnné deklarované jako static inicializované při spuštění programu. Pokud globální static proměnnou explicitně inicializujete, inicializuje se ve výchozím nastavení na hodnotu 0 a každému členu, který má typ ukazatele, je přiřazen ukazatel null.

  • Proměnné deklarované specifikátorem auto třídy register úložiště se inicializují při každém průchodu ovládacího prvku provádění do bloku, ve kterém jsou deklarovány. Pokud z deklarace auto proměnné register vynecháte inicializátor, počáteční hodnota proměnné není definována. U automatických a registrovaných hodnot není inicializátor omezen na konstantu; může to být libovolný výraz zahrnující dříve definované hodnoty, dokonce volání funkce.

  • Počáteční hodnoty pro deklarace externích proměnných a pro všechny static proměnné, ať už externí nebo interní, musí být konstantní výrazy. (Další informace najdete v tématu Konstantní výrazy.) Vzhledem k tomu, že adresa jakékoli externě deklarované nebo statické proměnné je konstantní, lze ji použít k inicializaci interně deklarované static proměnné ukazatele. Adresu auto proměnné ale nejde použít jako statický inicializátor, protože se může lišit pro každé spuštění bloku. K inicializaci auto a register proměnných můžete použít hodnoty konstanty nebo proměnné.

  • Pokud má deklarace identifikátoru obor bloku a identifikátor má externí propojení, deklarace nemůže inicializovat.

Příklady

Následující příklady ilustrují inicializace:

int x = 10;

Celočíselná proměnná x se inicializuje na konstantní výraz 10.

register int *px = 0;

Ukazatel px se inicializuje na hodnotu 0 a vytvoří ukazatel null.

const int c = (3 * 1024);

Tento příklad používá konstantní výraz (3 * 1024) k inicializaci c na konstantní hodnotu, kterou nelze upravit kvůli klíčovému slovu const .

int *b = &x;

Tento příkaz inicializuje ukazatel b s adresou jiné proměnné, x.

int *const a = &z;

a Ukazatel se inicializuje s adresou proměnné s názvem z. Vzhledem k tomu, že je zadaná jako proměnná a , lze proměnnou constinicializovat pouze, nikdy ji neupravovat. Vždy odkazuje na stejné umístění.

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   */
}

Globální proměnná GLOBAL je deklarována na externí úrovni, takže má globální životnost. Místní proměnná LOCALauto třídu úložiště a má adresu pouze během provádění funkce, ve které je deklarována. Proto pokus o inicializaci static proměnné lp ukazatele s adresou LOCAL není povolen. Proměnnou static gp ukazatele lze inicializovat na adresu GLOBAL , protože tato adresa je vždy stejná. Podobně lze inicializovat, *rp protože rp je místní proměnná a může mít nekontinuálně inicializátor. Pokaždé, když je blok zadán, LOCAL má novou adresu, která se pak přiřadí rp.

Viz také

Inicializace