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-specifiers
init-declarator-list
volit ;
declaration-specifiers
:
storage-class-specifier
declaration-specifiers
volit
type-specifier
declaration-specifiers
volit
type-qualifier
declaration-specifiers
volit
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é jakostatic
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řídyregister
ú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 deklaraceauto
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. Adresuauto
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 inicializaciauto
aregister
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 const
inicializovat 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á LOCAL
má auto
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
.