Hier ist die Initialisierung, die ich gerade in der Frage eines anderen gefunden habe.
my_data data[]={
{ .name = "Peter" },
{ .name = "James" },
{ .name = "John" },
{ .name = "Mike" }
};
Ich habe so etwas noch nie gesehen und kann keine Erklärung finden, wie .name möglich ist, um richtig zu sein.
Ich suche, wie dieser Prozess Schritt für Schritt verläuft.
Es sieht so aus, als würde es:
1) data;
2) *data;
3) (*data).name;
4) (*data).name="Peter";
Oder bin ich total falsch?
Es gibt hier nur zwei Syntaxen.
Einfache alte Array-Initialisierung:
int x[] = {0, 0}; // x[0] = 0, x[1] = 0
Ein bezeichneter Initialisierer. Sehen Sie sich die akzeptierte Antwort auf diese Frage an: Wie initialisiere ich eine Struktur gemäß den Standards der C-Programmiersprache
Die Syntax ist jedoch ziemlich selbsterklärend. Sie können wie folgt initialisieren:
struct X {
int a;
int b;
}
struct X foo = { 0, 1 }; // a = 0, b = 1
oder um eine Bestellung zu verwenden,
struct X foo = { .b = 0, .a = 1 }; // a = 1, b = 0
my_data
ist eine Struktur mit name
als Feld und data[]
ist eine Struktur von Strukturen. Sie initialisieren jeden Index. Lesen Sie folgendes:
5.20 Designierte Initialisierer :
Geben Sie in einem Strukturinitialisierer den Namen eines Felds an, das mit
.fieldname ='
vor dem Elementwert initialisiert werden soll. Zum Beispiel, gegeben der folgenden Struktur,struct point { int x, y; };
die folgende Initialisierung
struct point p = { .y = yvalue, .x = xvalue };
ist äquivalent zu
struct point p = { xvalue, yvalue };
Eine andere Syntax, die die gleiche Bedeutung hat, die seit GCC 2.5 veraltet ist, ist
fieldname:'
, wie hier gezeigt:struct point p = { y: yvalue, x: xvalue };
Sie können auch schreiben:
my_data data[]={
{ .name = "Peter" },
{ .name = "James" },
{ .name = "John" },
{ .name = "Mike" }
};
wie:
my_data data[]={
{ [0].name = "Peter" },
{ [1].name = "James" },
{ [2].name = "John" },
{ [3].name = "Mike" }
};
Das zweite Formular kann praktisch sein, da Sie nicht schreiben müssen, um beispielsweise oben zu entsprechen:
my_data data[]={
{ [3].name = "Mike" },
{ [1].name = "James" },
{ [0].name = "Peter" },
{ [2].name = "John" }
};
Lesen der Array-Initialisierung read Strange Initializer-Ausdruck
Zusätzlich können Sie auch die Antwort von @ Shafik Yaghmour für den Schalterfall lesen: Was ist "..." im Schalterfall im C-Code
Hier gibt es keine "Schritt für Schritt". Wenn die Initialisierung mit konstanten Ausdrücken durchgeführt wird, wird der Prozess im Wesentlichen zur Kompilierzeit ausgeführt. Wenn das Array als lokales Objekt deklariert ist, wird es natürlich lokal zugewiesen und zur Laufzeit initialisiert. Dies kann jedoch immer noch als ein einstufiger Prozess angesehen werden, der nicht sinnvoll unterteilt werden kann.
Mit designierten Initialisierern können Sie einen Initialisierer für ein bestimmtes Element eines Strukturobjekts (oder ein bestimmtes Element eines Arrays) bereitstellen. Alle anderen Member werden mit Null initialisiert. Wenn also my_data
als deklariert ist
typedef struct my_data {
int a;
const char *name;
double x;
} my_data;
dann deine
my_data data[]={
{ .name = "Peter" },
{ .name = "James" },
{ .name = "John" },
{ .name = "Mike" }
};
ist einfach eine kompaktere Form von
my_data data[4]={
{ 0, "Peter", 0 },
{ 0, "James", 0 },
{ 0, "John", 0 },
{ 0, "Mike", 0 }
};
Ich hoffe, Sie wissen, was das Letztere tut.
Es heißt designierter Initialisierer , der in C99 eingeführt wird. Es wird verwendet, um struct
oder Arrays zu initialisieren, in diesem Beispiel struct
.
Gegeben
struct point {
int x, y;
};
die folgende Initialisierung
struct point p = { .y = 2, .x = 1 };
entspricht dem C89-Stil
struct point p = { 1, 2 };
Dies ist ziemlich einfach: my_data
ist ein zuvor definierter Strukturtyp . Sie möchten also ein my_data
- Array einiger Elemente deklarieren, wie Sie dies auch tun würden
char a[] = { 'a', 'b', 'c', 'd' };
Das Array hätte also 4 Elemente und Sie initialisieren diese als
a[0] = 'a', a[1] = 'b', a[1] = 'c', a[1] ='d';
Dies wird als festgelegter Initialisierer bezeichnet (wie ich mich recht erinnere).
und es zeigt nur an, dass Daten vom Typ my_dat
sein müssen und ein Array sein muss, das so viele my_data-Strukturen speichern muss, dass es eine Struktur mit jedem Typmitgliednamen Peter, James, John und Mike gibt.
Es ist ein benannter Initialisierer , der mit dem C99-Standard eingeführt wurde; Damit können Sie bestimmte Mitglieder eines Struktur- oder Union-Objekts nach Namen initialisieren. my_data
ist offensichtlich ein typedef für einen struct
-Typ mit einem Member name
vom Typ char *
oder char [N]
.