Verständnis Probleme zu Pointer

02/21/2018 19:55 emmoplayer#1
Hallo Leute, ich habe jetzt einige Selbstversuche gemacht zu Pointern, aber bin am Ende nur durcheinander gekommen. Um sicher zu gehen wollte ich euch fragen, ob ich es soweit richtig verstanden habe und wo meine Probleme sind.

Bei dem ersten Link: 1.printf gibt die Adresse von b aus. 2.printf gibt den Wert von b als Hexadezimalzahl, aber wieso !? %p steht doch eigentlich für eine Adresse. 3. printf gibt den Wert von b aus. 4.printf gibt die Adresse des Pointers. 5. printf gibt die Adresse worauf der Pointer hinzeigt, also auf die Adresse von b 6. printf wieder die Hexidezimalzahl von b, wieso aber?! 7.printf der Wert worauf der Pointer gerade in der Adresse von b zeigt.

Bei dem zweiten Link habe ich oben den pointer nicht auf die Adresse von b gesetzt sondern auf b. Ich dachte somit zeigt der Pointer immer auf die Variable b egal wo er sich im Speicher befindet, sprich wenn sich der Speicher für b ändert, ändert das auch die Adresse worauf der Pointer zeigt.
Ich verstehe jetzt ehrlich gesagt nicht warum einige Sachen nicht angezeigt werden bzw warum sich zB bei der Ausgabe von a Adresse nicht mehr die Adresse von b ausgezeigt wird, sondern wieder eine Hexadezimalzahl.

Ich weiß, dass ich 100% irgendwo Denkfehler habe bzw falsche Ansätze, aber ich verstehe nicht wieso und was genau falsch sein soll.

Über eine Erklärung würde ich mich sehr freuen.


[Only registered and activated users can see links. Click Here To Register...]

[Only registered and activated users can see links. Click Here To Register...]
02/21/2018 23:17 かぎつめ#2
2.printf gibt den Wert aus, weil du B übergibst und nicht &B. Der Compiler interpretiert dies als Value Übergabe. (B an sich ist ein Integer / "Objekt" und kein Pointer)

6.printf *a bedeutet : den Wert auf den a zeigt (b) nicht die Adresse auf die a zeigt (&b). (Selbe wie bei 2, der Wert wird übergeben nicht die Adresse)

Erklärung:
Printf formatiert die übergebenen Parameter nur und interpretiert diese nicht. Gibst du ihm also nun einen Wert (z.B. B) bei nem "Pointer" an, formatiert er im Endeffekt trotzdem nur den Parameter in Hexadezimal egal was drin steht.
02/22/2018 13:37 emmoplayer#3
@ かぎつめ
Danke dir vielmals. Konnte komplett den ersten Teil nachvollziehen.
Hab nur noch Probleme bei dem zweiten Fall wo ich den Pointer a=b setze.
02/22/2018 16:16 algernong#4
Meinst du die Stelle?
Code:
int *a = b;
Hier findet ein implizierter Cast statt, der Zeiger a zeigt einfach auf Speicherstelle 10 (hex: 0x0A), weil das der Wert von b ist. Mit der Variable b hat der Zeiger dann nichts mehr zu tun; du könntest auch
Code:
int *a = 10;
schreiben und es wäre das selbe.

Dein Programm stürzt am Ende ab, weil du den Zeiger a derefenzierst, d.h. dein PC versucht, auf die Speicherstelle 10 tatsächlich zuzugreifen. Offenbar ist das aber gar keine gültige Speicherstelle, deswegen bricht dein Betriebssystem dein Programm ab.