Share via


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-specifiersinit-declarator-listopt;

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

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 staticstorage-class-specifier deklariert wird. Variablen, die als static deklariert sind, werden initialisiert, wenn die Programmausführung beginnt. Wenn Sie eine globale static-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 oder register 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 einer auto - oder register -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 deklarierte static -Zeigervariable zu initialisieren. Allerdings kann die Adresse einer auto-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, um auto - und register -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.

Siehe auch

Initialisierung