C++ Pointer
Urmel
- sonstiges
0 Dwaddy0 Urmel0 Christian Kruse
Hi zusammen, ich habe eine Frage bzgl. C++ Pointer. Da ich noch ein blutiger Anfänger bin wird sich diese Frage sehr wahrscheinlich auch schnell beantworten lassen.
ich verstehe den unterschied nicht von einem Initialisierenden Pointer.
Bei dem die Syntax folgendmaßen ausschaut.
int a,*pointer=&a;
bekomme ich keinen Compilerfehler.
Schreibe ich allerdings
nicht bei der Initalisierung sondern nach der Initalisierung
den wert in pointer um z.B.
*pointer = &a;
so erhalte ich einen compilerfehler, dass ist auch plausibel, da hierbei *pointer ein dereferenzierter Zeiger ist und &a nunmal ein Zeiger. So muss ich explizit den Zeiger &a dereferenzieren bzw. konvertieren indem ich
*pointer = *(&a);
angebe. Das klingt für mich auch logisch. allerdings bleibt für mich jetzt immer noch die Frage offen, WESSHALB klappt diese Zuweisung
int a,*pointer=&a;
bei der Initialisierung ???
Vielleicht habe ich auch alles falsch verstanden dann wäre ich froh wenn mir jemand erklären könnte wo mein logischer Verstand zu hapern anfängt.
Hi !
Irgendwie falsches Forum , aber mal sehen.
Ok, eine Variable a vom Typ int, ein Zeiger pointer, der auf a verweist.
Du versuchst die Adresse von a in die Variable, auf die der Pointer zeigt zu schreiben. Kann nicht gehen, da a vom Typ int ist.
Komplizierter als a = a, macht aber genau das gleiche (insofern pointer auf a verweist).
Ist wohl das, wonach Du suchst. Speichere die Adresse von a in pointer. Danach ist es egal, ob Du mit
arbeitest.
CU,
Dwaddy
Also erstmal Danke, für deine Antwort. Aber das war mir auch schon klar ;)
mir ging es halt darum zu wissen wesshalb bei der Initialisierung des Pointers die Angabe
int *pointer = &a;
funktioniert was eingentlich doch unlogisch ist. Denn was er doch hier versucht ist einen Zeiger einem Integer zuzuordnen. Sehe ich das falsch??
Desshalb bekomme ich ja auch einen Compilerfehler wenn ich nach der Initialisierung ,von *pointer, an *pointer einen neuen wert zuweise, welcher dann folgendermaßen ausschaut
*pointer = a&;
Das habe ich auch alles verstanden mir gings es halt nur darum warum es bei der Initialisierung s.o. ablaufen kann. Obwohl das doch eingentlich unlogisch ist?!
Gruß Urmel
Ps. Wahrscheinlich habe ich es doch nicht verstanden;), oder ??
Joho,
Also erstmal Danke, für deine Antwort. Aber das war mir auch schon klar ;)
Sah im Posting nicht so aus...
mir ging es halt darum zu wissen wesshalb bei der Initialisierung des Pointers die Angabe
int *pointer = &a;
funktioniert was eingentlich doch unlogisch ist. Denn was er doch hier versucht ist
einen Zeiger einem Integer zuzuordnen. Sehe ich das falsch??
Ja, siehst du. Bei der Variablen-Deklaration ist das * kein Dereferenzierungs-Operator,
sondern zeigt dem Compiler lediglich, dass die Variable ein Pointer des angegebenen Typs sein
soll. So waere
int a = 10,
*pointer = &a;
dasselbe wie
int a = 10,
*pointer = NULL;
pointer = &a;
Das habe ich auch alles verstanden mir gings es halt nur darum warum es bei der
Initialisierung s.o. ablaufen kann. Obwohl das doch eingentlich unlogisch ist?!
Nein, ist es nicht.
Gruss,
CK
Das habe ich auch alles verstanden mir gings es halt nur darum warum es bei der
Initialisierung s.o. ablaufen kann. Obwohl das doch eingentlich unlogisch ist?!
Nein, ist es nicht.
Du hast recht ;) entschuldige wenn ich ein wenig überheblich tat. Nun ist mir ein Licht aufgegangen und ich habe es vollkommen verstanden, aber diesmal wirklich !!!
Nun ich dachte immer ... ist ja jetzt auch egal, da ich es jetzt zu 100% prozent vertanden habe.
ist mir zu peinlich meinen falschen Gedanken in Worte zu fassen ;)
RIESEN DANKESCHÖN AN ALLE DIE MIR DABEI GEHOLFEN HABEN.
Gruß Urmel
Moin auch!
Du hast recht ;) entschuldige wenn ich ein wenig überheblich tat. Nun ist mir ein Licht aufgegangen und ich habe es vollkommen verstanden, aber diesmal wirklich !!!
Ja? Ok, Kontrollfrage: Wenn ich zwei Pointer auf int namens a und b deklariere, warum schreibe ich
int *a, *b;
und nicht
int* a, b;
?
So long
Joho,
Ja? Ok, Kontrollfrage: Wenn ich zwei Pointer auf int namens a und b deklariere, warum
schreibe ich
int *a, *b;
und nicht
int* a, b;
?
Was ist denn das fuer eine Frage?!
mit
int* a,b;
definierst du einen int-Pointer und eine int-Variable, und mit
int *a, *b;
zwei int-Pointer.
Gruss,
CK
Moin!
Was ist denn das fuer eine Frage?!
mit
int* a,b;
definierst du einen int-Pointer und eine int-Variable, und mit
int *a, *b;
zwei int-Pointer.
Schon richtig. Die eigentliche Frage war, warum muss ich vor jeden Variablennamen einen * schreiben und nicht nur einen * nach dem int? Schliesslich gibt man doch bei der Deklaration zuerst den Variablentyp und dann den Variablennamen oder mehrere durch Komma getrennte Namen an. Oder doch nicht? (<-- nicht-rhetorische Frage) Wenn ja, dann muesste es int* a, b heissen, denn int* heisst "Pointer auf int" und a, b ist die Auflistung der neuen Namen.
So long
Joho,
Schon richtig. Die eigentliche Frage war, warum muss ich vor jeden Variablennamen einen
* schreiben und nicht nur einen * nach dem int? Schliesslich gibt man doch bei der
Deklaration zuerst den Variablentyp und dann den Variablennamen oder mehrere durch Komma
getrennte Namen an. Oder doch nicht? (<-- nicht-rhetorische Frage) Wenn ja, dann muesste
es int* a, b heissen, denn int* heisst "Pointer auf int" und a, b ist die Auflistung der
neuen Namen.
Hm. Interessante Frage. Vielleicht, weil ein Pointer kein Datentyp ist?
Ansonsten wuerde ich darauf tippen, dass es sich einfach so eingebuergert hat und jetzt
in den C/C++-Specs drin steht.
Gruss,
CK
http://wwwtech.de
Hi again!
Na, ich hatte ja gehofft, es meldet sich noch jemand, der es weiss, aber da das wohl nicht der Fall ist, muss ich eben mal meine humble Vermutung kund tun.
Wenn man eine Variablendeklaration
int a;
in der Weise "Ein int kommt raus, wenn ich a hinschreibe" liest, dann uebersetzt sich
int * a;
als "Ein int kommt raus, wenn ich *a hinschreibe, also a dereferenziere", und dann muss a ein Pointer auf int sein. Dann ergibt sich leicht
int *a, *b;
als Deklaration zweier int-Pointer ("int kommt raus, wenn ich *a oder *b hinschreibe"). Diese etwas schraege Leseweise hat den Vorteil, auch die Syntax fuer Funktionspointer halbwegs nachvollziehbar zu machen:
void (*pfv)(int);
"void kommt raus, wenn ich pfv dreferenziere und das dann mit einem int-Parameter aufrufe"
pfv ist also ein Funktionspointer auf eine Funktion, die einen int nimmt und nichts zurueckliefert. (Klammern um *pfv sind notwendig, weil die () dahinter Vorrang vorm * haben.)
Allerdings ergibt sich dann die Frage, warum bei einem Typecast z.B.
int * a = (int *) malloc(irgendwas);
(int *) quasi als ein Typsymbol behandelt wird.
Ansonsten wuerde ich darauf tippen, dass es sich einfach so eingebuergert hat und jetzt
in den C/C++-Specs drin steht.
Naja, K&R werden sich schon irgendwas dabei gedacht haben, auch wenn man manchmal behauptet, ihre Sprache sei urspruenglich ein Aprilscherz gewesen.
So long