Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Ein Aggregattyp ist eine Struktur, Vereinigung oder ein Arraytyp. Wenn ein Aggregattyp Elemente von Aggregattypen enthält, werden die Initialisierungsregeln rekursiv angewendet.
Syntax
initializer:
{
initializer-list
} /* Für die aggregierte Initialisierung */
{
initializer-list
, }
initializer-list:
initializer
initializer-list
,
initializer
Dies initializer-list ist eine Liste von Initialisierern, die durch Kommas getrennt sind. Jeder Initialisierer in der Liste ist entweder ein konstanter Ausdruck oder eine Initialisierungsliste. Daher können Initialisierungslisten geschachtelt werden. Dieses Formular ist nützlich für die Initialisierung von Aggregatelementen eines Aggregattyps, wie in den Beispielen in diesem Abschnitt gezeigt. Wenn der Initialisierer für einen automatischen Bezeichner jedoch ein einzelner Ausdruck ist, muss es sich nicht um einen konstanten Ausdruck handeln; sie muss lediglich über einen geeigneten Typ für die Zuweisung zum Bezeichner verfügen.
Für jede Initialisierungsliste werden die Werte der Konstantenausdrücke den entsprechenden Membern der Aggregatvariablen zugewiesen.
Wenn initializer-list weniger Werte als ein Aggregattyp vorhanden sind, werden die verbleibenden Elemente oder Elemente des Aggregattyps auf 0 initialisiert. Der Anfangswert eines automatischen Bezeichners, der nicht explizit initialisiert wird, ist nicht definiert. Wenn initializer-list mehr Werte als ein Aggregattyp vorhanden sind, ergibt sich ein Fehler. Diese Regeln gelten für jede eingebettete Initialisierungsliste und für das Aggregat als Ganzes.
Der Initialisierer einer Struktur ist entweder ein Ausdruck desselben Typs oder eine Liste von Initialisierern für seine Elemente, die in geschweifte geschweifte Klammern ({ }) eingeschlossen sind. Nicht benannte Bitfeldmber werden nicht initialisiert.
Wenn eine Union initialisiert wird, initializer-list muss es sich um einen einzelnen Konstantenausdruck handeln. Der Wert des konstanten Ausdrucks wird dem ersten Mitglied der Union zugewiesen.
Wenn ein Array unbekannte Größe aufweist, bestimmt die Anzahl der Initialisierer die Größe des Arrays, und der Typ wird abgeschlossen. Es gibt keine Möglichkeit, Wiederholungen eines Initialisierers in C anzugeben oder ein Element in der Mitte eines Arrays zu initialisieren, ohne auch alle vorangehenden Werte anzugeben. Wenn Sie diesen Vorgang in Ihrem Programm benötigen, schreiben Sie die Routine in der Assemblysprache.
Die Anzahl der Initialisierer kann die Größe des Arrays festlegen:
int x[ ] = { 0, 1, 2 }
Wenn Sie die Größe angeben und die falsche Anzahl von Initialisierern angeben, generiert der Compiler jedoch einen Fehler.
Microsoft Specific
Die maximale Größe für ein Array wird durch size_tdefiniert.
Ende Microsoft-spezifisch
Beispiele
Dieses Beispiel zeigt Initialisierer für ein Array.
int P[4][3] =
{
{ 1, 1, 1 },
{ 2, 2, 2 },
{ 3, 3, 3,},
{ 4, 4, 4,},
};
Diese Anweisung deklariert P als 4:3-Array und initialisiert die Elemente der ersten Zeile auf 1, die Elemente der zweiten Zeile auf 2 usw. bis zur vierten Zeile. Die Initialisierungsliste für die dritte und vierte Zeile enthält Kommas nach dem letzten Konstantenausdruck. Auf die letzte Initialisierungsliste ({4, 4, 4,},) folgt auch ein Komma. Diese zusätzlichen Kommas sind zulässig, sind jedoch nicht erforderlich. Nur Kommas, die Konstantenausdrücke voneinander trennen, und Kommas, die eine Initialisierungsliste voneinander trennen, sind erforderlich.
Wenn ein Aggregatelement keine eingebettete Initialisierungsliste enthält, werden jedem Element des Unteraggregats Werte zugewiesen. Daher entspricht die Initialisierung im vorherigen Beispiel dem folgenden Beispiel:
int P[4][3] =
{
1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4
};
Geschweifte Klammern können auch um einzelne Initialisierer in der Liste angezeigt werden und helfen, das Beispiel zu verdeutlichen.
Wenn Sie eine Aggregatvariable initialisieren, müssen Sie darauf achten, Klammern und Initialisierungslisten ordnungsgemäß zu verwenden. Im folgenden Beispiel wird die Interpretation der geschweiften Klammern des Compilers ausführlicher veranschaulicht:
typedef struct
{
int n1, n2, n3;
} triplet;
triplet nlist[2][3] =
{
{ { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }, /* Row 1 */
{ { 10,11,12 }, { 13,14,15 }, { 16,17,18 } } /* Row 2 */
};
In diesem Beispiel wird als 2:3-Array von Strukturen deklariert, nlist wobei jede Struktur drei Elemente aufweist. Zeile 1 der Initialisierung weist der ersten Zeile von nlist, wie folgt Werte zu:
Die erste linke geschweifte Klammer in Zeile 1 signalisiert den Compiler, der die Initialisierung des ersten Aggregatelements von
nlist(dnlist[0]. h. ) beginnt.Die zweite linke Klammer gibt an, dass die Initialisierung des ersten Aggregatelements (
nlist[0]d. h. die Struktur beinlist[0][0]) beginnt.Die erste rechte Klammer endet mit der Initialisierung der Struktur
nlist[0][0]; die nächste linke Klammer beginnt mit der Initialisierung vonnlist[0][1].Der Vorgang wird bis zum Ende der Zeile fortgesetzt, wobei die schließende rechte Klammer die Initialisierung von
nlist[0]endet.
Zeile 2 weist der zweiten Zeile nlist auf ähnliche Weise Werte zu. Die äußeren Klammern, die die Initialisierer in den Zeilen 1 und 2 einschließen, sind erforderlich. Die folgende Konstruktion, die die äußeren Klammern ausgelassen, würde einen Fehler verursachen:
triplet nlist[2][3] = /* THIS CAUSES AN ERROR */
{
{ 1, 2, 3 },{ 4, 5, 6 },{ 7, 8, 9 }, /* Line 1 */
{ 10,11,12 },{ 13,14,15 },{ 16,17,18 } /* Line 2 */
};
In dieser Konstruktion beginnt die erste linke Klammer in Zeile 1 mit der Initialisierung von nlist[0], die ein Array von drei Strukturen ist. Die Werte 1, 2 und 3 werden den drei Elementen der ersten Struktur zugewiesen. Wenn die nächste rechte geschweifte Klammer (nach dem Wert 3) gefunden wird, wird die Initialisierung nlist[0] abgeschlossen, und die beiden verbleibenden Strukturen im Dreistrukturarray werden automatisch auf 0 initialisiert.
{ 4,5,6 } Initialisiert die erste Struktur in der zweiten Zeile von nlist. Die verbleibenden beiden Strukturen nlist[1] sind auf 0 festgelegt. Wenn der Compiler auf die nächste Initialisierungsliste ( { 7,8,9 } ) trifft, versucht er, zu initialisieren nlist[2]. Da nlist nur zwei Zeilen vorhanden sind, verursacht dieser Versuch einen Fehler.
Im nächsten Beispiel werden die drei int Member von x jeweils 1, 2 und 3 initialisiert.
struct list
{
int i, j, k;
float m[2][3];
} x = {
1,
2,
3,
{4.0, 4.0, 4.0}
};
In der list Struktur werden die drei Elemente in der ersten Zeile von m 4,0 initialisiert. Die Elemente der verbleibenden Zeile von m werden standardmäßig auf 0,0 initialisiert.
union
{
char x[2][3];
int i, j, k;
} y = { {
{'1'},
{'4'}
}
};
Die Union-Variable yin diesem Beispiel wird initialisiert. Das erste Element der Union ist ein Array, sodass der Initialisierer ein Aggregatinitialisierer ist. Die Initialisierungsliste {'1'} weist der ersten Zeile des Arrays Werte zu. Da nur ein Wert in der Liste angezeigt wird, wird das Element in der ersten Spalte für das Zeichen 1initialisiert, und die verbleibenden beiden Elemente in der Zeile werden standardmäßig auf den Wert 0 initialisiert. Entsprechend wird das erste Element der zweiten Zeile x des Zeichens 4initialisiert, und die verbleibenden beiden Elemente in der Zeile werden auf den Wert 0 initialisiert.