Inicializace skalárních typů
Při inicializaci skalárních typů je hodnota výrazu-přiřazení přiřazena proměnné.Použijí se pravidla převodu při přiřazení. (Další informace o pravidlech převodu naleznete v tématu Převody typů.)
Syntax
declaration:
specifikátory-deklarace seznam-deklarátorů-inicializace volitelné**;**specifikátory-deklarace:
specifikátor-třídy-úložiště specifikátory-deklarace volitelnéspecifikátor-typu specifikátory-deklarace volitelné
kvalifikátor-typu specifikátory deklarace volitelné
seznam-deklarátorů-inicializace:
deklarátor-inicializaceseznam-deklarátorů-inicializace , deklarátor-inicializace
deklarátor-inicializace:
declaratordeklarátor = inicializátor /* pro skalární inicializaci */
inicializátor:
výraz-přiřazení
Lze inicializovat proměnné libovolného typu za předpokladu, že vyhovují následujícím pravidlům:
Proměnné deklarované na úrovni rozsahu souboru mohou být inicializovány.Pokud proměnnou explicitně neinicializujete na vnější úrovni, je ve výchozím nastavení inicializována na hodnotu 0.
Konstantní výraz slouží k inicializaci jakékoli globální proměnné deklarované pomocí static specifikátor-paměťové-třídy.Proměnné deklarované jako static jsou inicializovány, jakmile začne provádění programu.Pokud není globální statická proměnná inicializována explicitně, je ve výchozím nastavení inicializována na hodnotu 0 a každý člen typu ukazatele je inicializován na hodnotu null.
Proměnné deklarované pomocí specifikátoru paměťové třídy auto nebo register jsou inicializovány pokaždé, když řízení provádění přejde do bloku, ve kterém jsou deklarovány.Pokud z deklarace proměnné auto nebo register vynecháte inicializátor, je počáteční hodnota proměnné nedefinována.Pro automatické hodnoty a hodnoty registru není inicializátor omezen na konstantu, může to být libovolný výraz zahrnující předem definované hodnoty i volání funkce.
Počáteční hodnoty externích deklarací proměnných a všech statických proměnných, vnějších nebo vnitřních, musí být konstantní výrazy. (Další informace naleznete v tématu Konstantní výrazy.) Protože je adresa všech externě deklarovaných nebo statických proměnných konstantní, lze ji použít k inicializaci interně deklarovaného statického ukazatele.Nicméně adresu proměnné auto nelze použít jako statický inicializátor, protože může být různá při každém spuštění bloku.Proměnné nebo konstantní hodnoty slouží k inicializaci proměnných auto a register.
Pokud má deklarace identifikátoru rozsah bloku a tento identifikátor má externí propojení, nemůže tato deklarace mít inicializaci.
Příklady
Následující příklady ilustrují inicializace:
int x = 10;
Celočíselná proměnná x je inicializována konstantním výrazem 10.
register int *px = 0;
Ukazatel px je inicializován na hodnotu 0, čímž se stane ukazatelem „null“.
const int c = (3 * 1024);
Tento příklad používá konstantní výraz (3 * 1024) k inicializaci proměnné c na konstantní hodnotu, kterou nelze změnit, protože je použito klíčové slovo const.
int *b = &x;
Tento příkaz inicializuje ukazatele b adresou jiné proměnné x.
int *const a = &z;
Ukazatel a je inicializován adresou proměnné s názvem z.Avšak protože je deklarován jako const, může být proměnná a pouze inicializována a už nikdy změněna.Vždy odkazuje na stejné místo.
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 vnější úrovni, takže má globální životnost.Lokální proměnná LOCAL je typu paměťové třídy auto a obsahuje adresu pouze během provádění funkce, ve které je deklarována.Proto pokus o inicializaci statické proměnné ukazatele lp adresou proměnné LOCAL není povolen.Statická proměnná ukazatele gp může být inicializována adresou proměnné GLOBAL, protože je tato adresa vždy stejná.Podobně může být inicializován ukazatel *rp, protože rp je místní proměnná a může mít nekonstantní inicializátor.Při každém vstupu do tohoto bloku, má proměnná LOCAL novou adresu, která je poté přiřazena do proměnné rp.