Antwort Aufbauend auf Quentins ein bisschen ...
Um das Mitglied einer Struktur Instanz zugreifen, können Sie einen Ausdruck wie
struct-expression
.
member-name
wo verwenden müssen struct-expression
ist ein Ausdruck des Typs struct
(z. B. die Strukturnamen data
oder data1
). Der Typ des Ausdrucks ist der Typ des Elements; daher ist der Typ des Ausdrucks data.grade
char
und der Typ data.ptr_dat
ist struct student *
(Zeiger auf struct student
).
Also, wenn Sie data.ptr_dat
dereferenzieren möchten, müssen Sie schreiben *data.ptr_dat
; IOW, Sie denerenzieren die Ausdruckdata.ptr_dat
. Der Ausdruck wird als *(data.ptr_dat)
geparst, da der Elementauswahloperator .
eine höhere Priorität als der unäre Operator *
hat.
Wenn Sie ein Mitglied der Spitz zustruct
Instanz zugreifen, würden Sie dereferenzieren data.ptr_dat
und verwenden Sie den .
Betreiber:
printf("%c\n", (*data.ptr_dat).grade);
Denken Sie daran, dass .
höher precendence hat als einstellige *
, so dass wir Verwenden Sie Klammern, um sicherzustellen, dass wir data.ptr_dat
, nicht data.ptr_dat.grade
dereferenzieren.
Das ist ein wenig ins Auge sticht, so C führte einen alternativen Mitglied Auswahloperator, ->
. Wo .
seine linken Operanden erwarten einen struct
Typen zu haben, die ->
Betreiber erwartet von seinen linken Operanden einen Zeiger-struct
Typen haben, so dass Sie den Ausdruck wie oben
printf("%c\n", data.ptr_dat->grade);
Der ->
Operator implizit schreiben Dereferenzierung data.ptr_dat
vor dem Zugriff grade
.
Dies wird das Leben leichter machen, wenn Sie eine Reihe von struct
s zusammen durch Zeiger verketten.Angesichts der folgenden Code:
struct student data1, data2, data3, *datap;
data2.ptr_dat = &data3;
data1.ptr_dat = &data2;
datap = &data1;
dann alle folgenden Ausdrücke auswerten, um die gleiche Sache:
data3.grade
data2.ptr_dat->grade
(*data2.ptr_dat).grade
data1.ptr_dat->ptr_dat->grade
(*data1.ptr_dat).ptr_dat->grade
(*(*data1.ptr_dat).ptr_dat).grade
datap->ptr_dat->ptr_dat->grade
(*datap).ptr_dat->ptr_dat->grade
(*(*datap).ptr_dat).ptr_dat->grade
(*(*(*datap).ptr_dat).ptr_dat).grade
Ich lasse Sie in ein kleines Geheimnis ... Wenn der Compiler sagt „Fehler“ , der ganze Rest der Nachricht wird Ihnen sagen, was der Fehler ist !!! Bitte komm nicht her und behandle die Menschen, als wären sie Compiler. Wenn Sie die Fehlermeldung nicht verstehen, dann weisen Sie uns zumindest darauf hin, dass Sie sie gelesen haben. – paddy
Der Begriff "selbstreferenziert" ist irreführend. C hat keine Referenzen und eine "Struktur" kann sich nicht selbst referenzieren. Sie haben nur einen Zeiger in Ihrer 'struct', der ** auf ein Objekt desselben Typs ** zeigen kann. Das unterscheidet sich nicht von einem Zeiger auf einen anderen Typ. – Olaf
Keine Ahnung. Wenn nur Compiler Fehlermeldungen ausgegeben haben, die auf das Problem hingewiesen haben und auf welcher Zeile es gefunden wurde .... –