Nun, ich muss auch etwas hinzufügen. Die Struktur unterscheidet sich ein wenig vom Array, da das Array ein Zeiger ist und die Struktur nicht. Also sei vorsichtig!
Nehmen wir an, ich schreibe diesen nutzlosen Code:
#include <stdio.h>
typedef struct{
int km;
int kph;
int kg;
} car;
int main(void){
car audi = {12000, 230, 760};
car *ptr = &audi;
}
Hier zeigt der Zeiger ptrauf die Adresse ( ! ) Der Strukturvariablen, hat audiaber neben der Adressstruktur auch einen Datenblock ( ! )! Das erste Mitglied des Datenblocks hat dieselbe Adresse wie die Struktur selbst, und Sie können die Daten abrufen, indem Sie nur einen Zeiger wie diesen dereferenzieren*ptr (keine geschweiften Klammern) .
Aber Wenn Sie ein anderes Mitglied als das erste Acess wollen, müssen Sie einen Bezeichner hinzufügen wie .km, .kph, .kgdie nichts mehr als Offsets auf die Basisadresse des Datenblock ...
Aufgrund der Vorrangstellung können Sie jedoch nicht schreiben, *ptr.kgda der Zugriffsoperator .vor dem Dereferenzierungsoperator ausgewertet wird *und Sie erhalten, *(ptr.kg)was nicht möglich ist, da der Zeiger keine Mitglieder hat! Und der Compiler weiß das und wird daher einen Fehler ausgeben, zB:
error: ‘ptr’ is a pointer; did you mean to use ‘->’?
printf("%d\n", *ptr.km);
Stattdessen verwenden Sie diese (*ptr).kgund Sie Compiler erzwingen 1. den Zeiger dereferenzieren und ermöglichen acess zum Teil der Daten und zweiten Sie einen Offset (Bezeichner) in dem das Element zu wählen.
Überprüfen Sie dieses Bild, das ich gemacht habe:

Wenn Sie jedoch verschachtelte Mitglieder hätten, wäre diese Syntax unlesbar und wurde daher ->eingeführt. Ich denke, Lesbarkeit ist der einzige berechtigte Grund für die Verwendung, da dies ptr->kgviel einfacher zu schreiben ist als(*ptr).kg .
Lassen Sie uns dies jetzt anders schreiben, damit Sie den Zusammenhang klarer sehen. (*ptr).kg⟹ (*&audi).kg⟹ audi.kg. Hier habe ich zuerst die Tatsache verwendet, dass ptres sich um eine "Adresse von audi" handelt, dh die &audiTatsache, dass "Referenz" & und "Dereferenzierung" * -Operatoren gegenseitig aufheben.