Initialisieren von skalaren Typen
Wenn Sie skalare Typen initialisieren, wird der Variablen der Wert von assignment-expression
zugewiesen. Die Konvertierungsregeln für Zuweisungen gelten. (Weitere Informationen zu Konvertierungsregeln finden Sie unter Typkonvertierungen.)
Syntax
declaration
:
declaration-specifiers
optinit-declarator-list
;
declaration-specifiers
:
storage-class-specifier
declaration-specifiers
opt
type-specifier
declaration-specifiers
opt
type-qualifier
declaration-specifiers
opt
init-declarator-list
:
init-declarator
init-declarator-list
,
init-declarator
init-declarator
:
declarator
declarator
=
initializer
/* Für eine skalare Initialisierung */
initializer
:
assignment-expression
Sie können Variablen jedes Typs initialisieren, solange Sie die folgenden Regeln beachten:
Variablen, die auf der Dateigültigkeitsebene deklariert werden, können initialisiert werden. Wenn Sie eine Variable auf der externen Ebene nicht explizit initialisieren, wird diese standardmäßig mit 0 initialisiert.
Es kann ein konstanter Ausdruck verwendet werden, um eine beliebige globale Variable zu initialisieren, die mit
static
storage-class-specifier
deklariert wird. Variablen, die alsstatic
deklariert sind, werden initialisiert, wenn die Programmausführung beginnt. Wenn Sie eine globalestatic
-Variable nicht explizit initialisieren, wird diese standardmäßig mit 0 initialisiert, und jedem Member, der den Zeigertyp aufweist, wird ein NULL-Zeiger zugewiesen.Mit den Speicherklassenspezifizierern
auto
oderregister
deklarierte Variablen werden jedes Mal initialisiert, wenn die Ausführungssteuerung an den Block übergeben wird, in dem sie deklariert sind. Wenn Sie in der Deklaration einerauto
- oderregister
-Variablen den Initialisierer weglassen, ist der Anfangswert der Variablen nicht definiert. Für automatische Werte und Registerwerte muss der Initialisierer keine Konstante sein, sondern kann ein beliebiger Ausdruck sein, der vorher definierte Werte und sogar Funktionsaufrufe enthält.Die Anfangswerte für externe Variablendeklarationen und alle
static
-Variablen, egal ob extern oder intern, müssen konstante Ausdrücke sein. (Weitere Informationen finden Sie unter Konstante Ausdrücke.) Da die Adresse von allen extern deklarierten oder statischen Variablen konstant ist, kann sie verwendet werden, um eine intern deklariertestatic
-Zeigervariable zu initialisieren. Allerdings kann die Adresse einerauto
-Variablen nicht als statischer Initialisierer verwendet werden, da sie bei jeder Ausführung des Blocks abweichen kann. Sie können entweder Konstanten- oder Variablenwerte verwenden, umauto
- undregister
-Variablen zu initialisieren.Wenn die Deklaration eines Bezeichners einen Blockbereich umfasst und der Bezeichner über eine externe Bindung verfügt, kann die Deklaration keine Initialisierung aufweisen.
Beispiele
In den folgenden Beispielen werden Initialisierungen dargestellt:
int x = 10;
Die ganzzahlige Variable x
wird mit dem konstanten Ausdruck 10
initialisiert.
register int *px = 0;
Der Zeiger px
wird mit 0 initialisiert und erzeugt einen "null"-Zeiger.
const int c = (3 * 1024);
In diesem Beispiel wird ein konstanter Ausdruck ((3 * 1024)
) verwendet, um c
mit einem konstanten Wert zu initialisieren, der aufgrund des Schlüsselworts const
nicht geändert werden kann.
int *b = &x;
Diese Anweisung initialisiert den Zeiger b
mit der Adresse der anderen Variablen x
.
int *const a = &z;
Der Zeiger a
wird mit der Adresse einer Variablen namens z
initialisiert. Da sie aber als const
angegeben wurde, kann die Variable a
nur initialisiert, aber niemals geändert werden. Sie zeigt immer auf denselben Speicherort.
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 */
}
Die globale Variable GLOBAL
wird auf der externen Ebene deklariert und hat daher eine globale Lebensdauer. Die lokale Variable LOCAL
verfügt über die Speicherklasse auto
und weist nur während der Ausführung der Funktion, in der sie deklariert ist, eine Adresse auf. Daher ist der Versuch, die static
-Zeigervariable lp
mit der Adresse LOCAL
zu initialisieren, unzulässig. Die static
-Zeigervariable gp
kann mit der Adresse von GLOBAL
initialisiert werden, da diese Adresse immer gleich ist. Entsprechend kann *rp
initialisiert werden, da rp
eine lokale Variable ist und einen nicht konstanten Initialisierer aufweisen kann. Immer wenn der Block erreicht wird, hat LOCAL
eine neue Adresse, die dann rp
zugewiesen wird.