Frage zu Zeiger
-
Das coole ist: Das wissen wir auch nicht. Grund: Siehe rüdigers Antwort.
-
Schämt euch, dass sind absolute Grundlagen, sowas muss man einfach wissen, es sei den, man hat gerade erst sein Hello World Programm geschrieben.
%x steht für Hexadezimalzahlen
Beispiel
int x;
int *zeiger1;*zeiger1 = x
*zeiger1 <- beinhaltet den Wert einer variable auf die zeiger1 zeigt.
zeiger1 <- beinhaltet die Offset Adresse von der Variable x.
&zeiger1 <- ist die Adresse vom zeiger selbst.und %x in einem printf gibt dann nunmal eine zahl als Hexadezimalzahl aus.
Und wenn ich mich jetzt Irre, weiß ich auch nicht^^
-
Grafzahl schrieb:
[...]
und %x in einem printf gibt dann nunmal eine zahl als Hexadezimalzahl ausJetzt bist du uns noch die Erklärung schuldig, was Zeiger mit Zahlen zu tun haben (und warum's %p eigentlich überhaupt gibt).
-
Grafzahl schrieb:
*zeiger1 = x
dir ist schon klar das du es in einer zeile auf 3 fehler gebracht hast oder?
alternativ könnten wir uns noch auf einen in der 2. und einen in der 3. einigen was in der summe 2 macht, wär dann nicht mehr ganz so wild und nachdem du das nicht getestet haben kannst bekommst von mir auch kein fleiß sternchenGrafzahl schrieb:
Und wenn ich mich jetzt Irre, weiß ich auch nicht^^
Errare humanum est, sed in errare perseverare diabolicum.
-
Hmm stimmt, jetzt schäme ich mich : D
gut, dann korrigiere ich mich mal:
Schämt euch, dass sind absolute Grundlagen, sowas muss man einfach wissen, es sei den, man hat gerade erst sein Hello World Programm geschrieben.
%x steht für Hexadezimalzahlen
Beispiel
int x = 5;
int *zeiger1;zeiger1 = &x;
*zeiger1 <- Greift auf den Inhalt der variable x zu.
printf("*zeiger1 = %d",*zeiger1); gibt somit 5 aus...zeiger1 <- beinhaltet die Offset Adresse von der Variable x.
&zeiger1 <- ist die Adresse vom Zeiger selbst.und %x gibt einen integer als Hexadezimalzahl aus.
Und wenn ich mich jetzt Irre, weiß ich auch nicht^^
Zurück zur Frage in dem Fall gibt
zeiger1 = &test; printf("Zeiger1: %x" , zeiger1 ); //die Adresse von der in dem Zeiger gespeicherten Variable printf("Zeiger1: %x" , &zeiger1 ); //Gibt die Adresse vom Zeiger selbst im Arbeitsspeicher
Warum das so funktioniert liegt einfach daran, dass die Adressen nun mal als Hexadezimalzahl angegeben werden und %x nun mal Hexadezimalzeichen ausgibt.
Und %p nun mal der dafür vorgesehen Operator ist und so ein hübsches "0x" vor die Adresse setzt, benutzt man es besser für dafür.So, Grafzahl hat sich nun hoffentlich wieder reingewaschen und kann wieder zählen. 1, 2, 3, 4,...
-
Grafzahl schrieb:
Warum das so funktioniert liegt einfach daran, dass die Adressen nun mal als Hexadezimalzahl angegeben werden und %x nun mal Hexadezimalzeichen ausgibt.
Und %p nun mal der dafür vorgesehen Operator ist und so ein hübsches "0x" vor die Adresse setzt, benutzt man es besser für dafür.So, Grafzahl hat sich nun hoffentlich wieder reingewaschen und kann wieder zählen. 1, 2, 3, 4,...
Und was passiert, wenn auf meiner Maschine ein Adressregister 32 bit hat, ein Allzweckregister aber nur 16?
-
Boah, bist du gemein -.-.
Soviel weiß ich noch nicht von den Internen Abläufen, habe mit Assembler erst vor kurzem angefangen. Ist aber eine interessante Frage, ich würde sagen, man rechnet den Krempel einfach um?!
-
Oder man gibts halt als %p aus, dann muss man sich um so nen Blödsinn nicht kümmern
Hat schon seinen Grund, dass es eine eigene Formatierungsanweisung für Pointer gibt.
-
Grafzahl schrieb:
Boah, bist du gemein -.-.
Macht nix, hab das auch durchmachen müssen.
Grafzahl schrieb:
Soviel weiß ich noch nicht von den Internen Abläufen, habe mit Assembler erst vor kurzem angefangen. Ist aber eine interessante Frage, ich würde sagen, man rechnet den Krempel einfach um?!
Ich kann bis heute keine ordentlichen Assembler-Programme schreiben. Manchmal reicht es aber, nur einen Überblick zu haben. Jedenfalls bekommt man Probleme, wenn man ein 32-Bit-Wort in ein 16-Bit-Wort pressen will. Da ist es sehr praktisch, dass die Sprache eigene Zeiger-Typen anbietet, weil man damit solche Probleme umschiffen kann. Letztlich ist genau das der Grund für die Existenz des
%p
, nämlich dass ein Zeiger eine andere Breite als eine Zahl haben kann. Und die Breite muss printf() natürlich wissen, sonst gibt es Unfug aus.Du kannst mit C ohne Probleme Programme schreiben, die von 8-Bittern bis zu 64-Bittern laufen, wenn du auf solche Dinge achtest. Wenn du nun aber annimst, dass int's genauso breit sind wie Zeiger, beschränkst du dich auf die Architekturen, bei denen das wirklich so ist.
-
Übrigens ist das eine der Beobachtungen, die zur Entwicklung von C geführt haben:
http://cm.bell-labs.com/cm/cs/who/dmr/chist.html schrieb:
Finally, the B and BCPL model implied overhead in dealing with pointers: the language rules, by defining a pointer as an index in an array of words, forced pointers to be represented as word indices. Each pointer reference generated a run-time scale conversion from the pointer to the byte address expected by the hardware.
For all these reasons, it seemed that a typing scheme was necessary to cope with characters and byte addressing, and to prepare for the coming floating-point hardware. Other issues, particularly type safety and interface checking, did not seem as important then as they became later.
Wer weiss, wenn die damals nicht eine Maschine mit einem anderen Adressierungs-Scheme bekommen hätten, wäre C vielleicht nie erfunden worden.
-
Grafzahl schrieb:
int x;
int *zeiger1;
*zeiger1 = xDu solltest dich dringend noch mal mit Zeigern beschäftigen...
zeiger1 verfügt über keinerlei speicherplatz, kann daher auch nicht den inhalt einer anderen variable "lagern". Kurz gesagt: das von dir geschriebene gibt einen Crash...
(in dieser Ansicht unterstützt mich mein zufällig anwesender Borland-Compiler auch)
Er sagt nicht viel, außer: "peng"
-
Da kann man ja glatt sentimental werden und sich wünschen bei den Entwicklungen dabei gewesen zu sein : ).
Du solltest dich dringend noch mal mit Zeigern beschäftigen...
zeiger1 verfügt über keinerlei speicherplatz, kann daher auch nicht den inhalt einer anderen variable "lagern". Kurz gesagt: das von dir geschriebene gibt einen Crash...
(in dieser Ansicht unterstützt mich mein zufällig anwesender Borland-Compiler auch)
Er sagt nicht viel, außer: "peng"
Ist ja schon gut, ich habe mich schon verbessert^^, ich tische ja sogar keine Ausreden auf den Tisch nur Mineralwasser und Staub. Und wo wir gerade dabei sind, gönne ich mir eine Schüssel Staub mit Milch...