2016-04-06 7 views
-2

Ich lerne selbst referenzierte Strukturen in C. Was ist der Fehler im folgenden Code? Wie kann ich es funktionieren lassen?Wie verwendet man selbst referenzierende Strukturen in C?

#include<stdio.h> 

struct student 
{ 
    char grade; 
    struct student *ptr_dat; //we have a pointer of datatype struct student. 
}; 

int main() 
{ 
    struct student data; 
    struct student data1; 
    data.grade = 'C'; 
    data1.grade = 'B'; 

    data.ptr_dat = &data1; //the address of another structure is assigned. 

    /* 
    print the element grade in both structures directly. 
    */ 
    printf("%c\n",data.grade); 
    printf("%c\n",data1.grade); 
    /* 
    how to print the element grade in data1 using pointer 
    */ 
    printf("%c\n",data.(*ptr_dat)); //This is error. 

    return 0; 

} 

Vielen Dank im Voraus.

+3

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

+0

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

+0

Keine Ahnung. Wenn nur Compiler Fehlermeldungen ausgegeben haben, die auf das Problem hingewiesen haben und auf welcher Zeile es gefunden wurde .... –

Antwort

6

Einfacher Syntaxfehler: Sie können auf die data1 Klasse mit data.ptr_dat->grade zugreifen.

+2

Was der Übersichtlichkeit halber "(* data.ptr_dat) .grade" entspricht. In der Praxis würde jeder den Operator '->' verwenden. –

+0

Vielen Dank. – Resmi

+0

@JohnBollinger Ich habe deine Antwort nicht bekommen. Können Sie bitte erklären, wie es gleichwertig ist? –

0

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.gradechar 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 
+0

Vielen Dank. – Resmi