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 ptr
auf die Adresse ( ! ) Der Strukturvariablen, hat audi
aber 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
, .kg
die nichts mehr als Offsets auf die Basisadresse des Datenblock ...
Aufgrund der Vorrangstellung können Sie jedoch nicht schreiben, *ptr.kg
da 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).kg
und 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->kg
viel 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 ptr
es sich um eine "Adresse von audi
" handelt, dh die &audi
Tatsache, dass "Referenz" &
und "Dereferenzierung" *
-Operatoren gegenseitig aufheben.