Unterschied zw. '->' und '.'
-
Hallo! habe eine Frage zu Struktur, wie ich das gelernt habe, wenn ich eine Element aus meine Struct zugreifen möchte, benutze ich immer '.' .z.B.
Student.Name....
aber in soche Code habe ich auch gesehen, wie z.B.
Student->Name ...
sind die beide identisch? oder doch unterschiedlich
-
-> heißt du hast einen Pointer in der Hand und willst auf ein Member von dem struct zugreifen,
. ist dasselbe, nur bei statisch allokierten structs.
-
Hallo,
der Unterschied liegt darin, dass die Variable Student im ersten Fall als Typ den <Struktur-Typ> besitzt (der "."-Operator reicht zum Zugriff), im zweiten Fall aber den Typ "Zeiger auf <Struktur-Typ>" (hierfür gibt es den "->"-Operator. Er ist nur eine Abkürzung für das etwas umständlicher zu schreibende *(Student).Name, denn ein Zeiger muss erst dereferenziert werden, damit man auf die Struktur-Elemente zugreifen kann). Du musst nur im Quelltext nachsehen, wo die Variable definiert wird, dann wirst du den Unterschied in den Typen auch sehen.
MfG,
Probe-Nutzer
-
hat jemand eine einfach Beispiele? :p mit dem Point habe ich Kopfschmerzen
-
Aha! heißt das, dass die Beiden eigentlich identisch sind? nur bei Zeiger auf eine Struct muss ich '->' benutzen.
-
gy100002000 schrieb:
Aha! heißt das, dass die Beiden eigentlich identisch sind? nur bei Zeiger auf eine Struct muss ich '->' benutzen.
yep, genau so ist es
-
//Daten mit membervariablen struct Data{ int A,B; }; //STack statisch Data oStatisch; //zugriff über objekt oStatisch.A= 1; oStatisch.B= 1; //--------------------------------- //heap dynamisch Data *pDynamisch = malloc(sizeof(Data)); //zugriff über pointer pDynamisch->A=0; pDynamisch->B=0; free(pDynamisch); //------------------------------------- Data oStatisch2; Data *p= &oStatisch; //p Pointer zeigt auf statischer Objekt oStatisch p->A=1; p->B=2;
-
alles klar! Danke an Alle!
-
vielleicht sollte man noch hinzufügen, dass -> automatisch deferenziert.
Beispiel:
struct Data { int value; }; /* ... */ /* auf dem heap */ struct Data* dat = malloc(sizeof(struct Data)); /* somit ist */ dat->value = 10; /* dasselbe wie */ (*dat).value = 10; /* -> deferenziert automatisch, d.h. x-> wird zu (*x). free(dat);
-
Hallo,
Xantus schrieb:
vielleicht sollte man noch hinzufügen, dass -> automatisch deferenziert.
Habe ich doch gemacht
MfG,
Probe-Nutzer
-
Probe-Nutzer schrieb:
Hallo,
Xantus schrieb:
vielleicht sollte man noch hinzufügen, dass -> automatisch deferenziert.
Habe ich doch gemacht
MfG,
Probe-Nutzer
Oh, pardon, überlesen
Mit den vielen tollen Source-Beispielen hier wär das doch eigentlich auch was für die FAQ, oder nicht?