Zusätzlich zu all diesen guten Antworten eine Zusammenfassung, wie man eine Struktur (Union und Array) in C initialisiert, mit besonderem Augenmerk auf den Designed Initializer.
Standard-Initialisierung
struct point
{
double x;
double y;
double z;
}
p = {1.2, 1.3};
Bezeichneter Initialisierer
Der Designated Initializer ist seit ISO C99 aufgetaucht und ist eine andere und dynamischere Art, in C zu initialisieren, wenn man struct
, union
oder ein array
.
Der größte Unterschied zur Standardinitialisierung besteht darin, dass Sie die Elemente nicht in einer festen Reihenfolge deklarieren müssen und dass Sie auch Elemente weglassen können.
Von der GNU-Leitfaden :
Der C90-Standard verlangt, dass die Elemente eines Initialisierers in einer festen Reihenfolge erscheinen, die der Reihenfolge der Elemente in dem zu initialisierenden Array oder der Struktur entspricht.
In ISO C99 kann man die Elemente in zufälliger Reihenfolge angeben, indem man die Array-Indizes oder Strukturfeldnamen angibt, auf die sie sich beziehen, und GNU C erlaubt dies als Erweiterung auch im C90-Modus
事例紹介
1. Array-Index
Standard-Initialisierung
int a[6] = { 0, 0, 15, 0, 29, 0 };
Bezeichnete Initialisierung
int a[6] = {[4] = 29, [2] = 15 }; // or
int a[6] = {[4]29 , [2]15 }; // or
int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };
2. Struktur oder Vereinigung:
Standard-Initialisierung
struct point { int x, y; };
Bezeichnete Initialisierung
struct point p = { .y = 2, .x = 3 }; or
struct point p = { y: 2, x: 3 };
3. Kombinieren Sie die Benennung von Elementen mit der normalen C-Initialisierung aufeinanderfolgender Elemente:
Standard-Initialisierung
int a[6] = { 0, v1, v2, 0, v4, 0 };
Bezeichnete Initialisierung
int a[6] = { [1] = v1, v2, [4] = v4 };
4. Andere:
Beschriftung der Elemente eines Array-Initialisierers
int whitespace[256] = { [' '] = 1, ['\t'] = 1, ['\h'] = 1,
['\f'] = 1, ['\n'] = 1, ['\r'] = 1 };
eine Reihe von '.fieldname' und '[index]' Bezeichnern vor ein '=' schreiben, um ein verschachteltes Unterobjekt zu initialisieren
struct point ptarray[10] = { [2].y = yv2, [2].x = xv2, [0].x = xv0 };
Leitfäden