Frage zu Struct und Pointer

spaci76
Mausschubser
Mausschubser
Beiträge: 52
Registriert: 9. Mai 2009 18:27

Frage zu Struct und Pointer

Beitrag von spaci76 »

Ich hab mal ne Frage hier zu:
wenn ich versuche mir die 1 von a ausgeben zulassen dann geht das nur mit dem folien bespiel.

Code: Alles auswählen

1. struct vector3_t{
2. int x, y, z;
3. } a = {1, 2, 3};
4. vector3_t *b = &a; // b zeigt auf a

cout << b->x << endl;
Ich habe es nicht verstanden wieso man hier nicht einfach ein:

Code: Alles auswählen

cout << a->x << endl;


machen kann. könnt mir das jemand bitte erklären?

ich danke im voraus
daniel

mw1039
Computerversteher
Computerversteher
Beiträge: 346
Registriert: 12. Apr 2011 12:18

Re: Frage zu Struct und Pointer

Beitrag von mw1039 »

a ist ein struct und b ist ein Pointer auf ein struct. Deswegen musst du bei a den Punkt-Operator (cout << a.x << endl;) benutzen. Bei b muss erst dereferenziert werden, um auf den Speicherinhalt hinter der in b stehenden Adresse zu kommen. D.h. man macht *b (fuer die Dereferenzierung) und dann wendet man darauf den Punkt-Operator an: cout << (*b).x << endl; Weil das zu lang ist und oft benutzt wird, gibt es dann dafuer die Abkuerzung b->x

Also bei structs (und auch bei Klassen. In C++ unterscheiden sich eigentlich structs und Klassen fast nicht. structs duerfen auch Methoden haben) immer den Punkt-Operator benutzen und bei Pointern auf structs immer den Pfeiloperator.

spaci76
Mausschubser
Mausschubser
Beiträge: 52
Registriert: 9. Mai 2009 18:27

Re: Frage zu Struct und Pointer

Beitrag von spaci76 »

mw1039 hat geschrieben: Also bei structs (und auch bei Klassen. In C++ unterscheiden sich eigentlich structs und Klassen fast nicht. structs duerfen auch Methoden haben) immer den Punkt-Operator benutzen und bei Pointern auf structs immer den Pfeiloperator.
Vielen Dank für die ausführliche Erläuterung! Jetzt hab ichs :mrgreen:

bttf
Mausschubser
Mausschubser
Beiträge: 76
Registriert: 9. Nov 2011 14:04

Re: Frage zu Struct und Pointer

Beitrag von bttf »

Noch eine Frage zur H2 von Übung 4

Ich habe mir ein struct person deklariert

struct person {
char vorname[25];
char nachname[25];
int alter;
float gewicht;
};


In der main Funktion erzeuge ich mir dann eine Person p1. Vier Zeilen drunter rufe ich dann func3(p1) auf. Also übergebe ich das per Referenz.

void func3(person& p){
printf("%p\n", p);
printf("%s\n", p.vorname);
printf("%s\n", p.nachname);
printf("%d\n", p.alter);
printf("%f\n", p.gewicht);
}


Die Zeile "printf("%p\n", p);" gibt mir aber nicht die Adresse des übergebenen p1 aus, was ich nicht verstehe, weil eigentlich nach dem Aufruf von func3(p1) müsse in dem Parameter p innerhalb func3 doch die Adresse von p1 stehen, oder nicht? Erst wenn ich "printf("%p\n", &p);" schreibe, gibt er mir die Adresse aus, aber ist das "&" dann nicht "doppelt"?

mfg bttf


Rufe dann in der main Funktion dann func3

mw1039
Computerversteher
Computerversteher
Beiträge: 346
Registriert: 12. Apr 2011 12:18

Re: Frage zu Struct und Pointer

Beitrag von mw1039 »

& hat hier eine doppelte Bedeutung. In Funktionssignaturen bedeutet es, dass der Parameter per Referenz uebergeben wird. In printf("%p\n",&p); ist es der Adressoperator, der die zu einer Nicht-Pointer-Variable die Adresse zurueckgibt.

Das ist aehnlich wie mit dem Stern: Bei der Deklaration von Variablen gibt er an, dass die Variable ein Pointer ist und in Ausdruecken bedeutet er, dass man einen Pointer dereferenzieren moechte.

bttf
Mausschubser
Mausschubser
Beiträge: 76
Registriert: 9. Nov 2011 14:04

Re: Frage zu Struct und Pointer

Beitrag von bttf »

Ok, also wenn ich meine Person p1 per Referenz übergebe, dann hat das mit der Adresse von p1 erstmal gar nichts zu tun, richtig? Das heißt nur, dass z.b. nach

p.nachname = "hallo";

innerhalb von func3, nach Durchlauf von func3, wenn ich wieder in der main Funktion bin und dort den Nachnamen ausgeben würde, würde mir dann hallo ausgegeben werden.

Das stimmt doch so, oder? So hab ich es nämlich jetzt verstanden. Damit wäre mir dann auch klar, warum ich beim Ausgeben der Adresse der per Referenz übergebenen Person noch das "&" brauche :mrgreen:

mfg bttf

mw1039
Computerversteher
Computerversteher
Beiträge: 346
Registriert: 12. Apr 2011 12:18

Re: Frage zu Struct und Pointer

Beitrag von mw1039 »

Genau. Die Uebergabe von Parametern per echter Referenz versteckt im Grunde die Pointergeschichten vor dem Programmierer. Dadurch ist beim Aufruf der Funktion und bei der Verwendung des betreffenden Parameters innerhalb der Funktion optisch nicht von der Uebergabe by-value unterscheidbar. Und deswegen musst du auf sie wie auf einen by-value uebergebenen Wert & anwenden um die Adresse zu bekommen.

Antworten

Zurück zu „Archiv“