Schließlich machen diese beiden Aussagen dasselbe …
int a = 10;
int *b = &a;
printf("%pn",b);
printf("%08Xn",b);
Zum Beispiel (mit unterschiedlichen Adressen):
0012FEE0
0012FEE0
Es ist trivial, den Zeiger wie gewünscht mit zu formatieren %xalso gibt es eine gute Verwendung für die %p Möglichkeit?
Durch die Verwendung von ‘%p’ geben Sie die Adresse der betreffenden Variablen aus: “Das void * Zeigerargument wird hexadezimal gedruckt (wie von %#x oder %#lx).”
– Benutzer1831086
3. März 10 um 10:26 Uhr
In C++ können Sie (void *) typecast verwenden: siehe stackoverflow.com/questions/5657123/…
– kagali-san
14. April 11 um 0:21 Uhr
Peter Hosey
Sie tun nicht dasselbe. Letzteres printf Aussage interpretiert b als ein unsigned intwas falsch ist, wie b ist ein Zeiger.
Zeiger u unsigned ints sind nicht immer gleich groß, daher sind diese nicht austauschbar. Wenn sie nicht die gleiche Größe haben (ein immer häufigerer Fall, da 64-Bit-CPUs und Betriebssysteme immer häufiger verwendet werden), %x druckt nur die Hälfte der Adresse. Auf einem Mac (und wahrscheinlich einigen anderen Systemen) das Wille die Adresse ruinieren; die Ausgabe wird falsch sein.
Verwenden Sie immer %p für Zeiger.
%p wird auch eine angemessene Texturdarstellung für den Zeiger für die Plattform verwenden. Auf Plattformen, auf denen es üblich ist, Zeiger in Hex darzustellen, macht dies keinen Unterschied, solange die Größe korrekt ist, aber für eine segmentierte Architektur (erinnern Sie sich an DOS?) kann es eine Segment:Offset-Darstellung verwenden.
– Ein Programmierer
3. März 10 um 8:23 Uhr
Man muss auch werfen b zu void * mit dem %p format – dies ist einer der wenigen Fälle in C, wo man eine Umwandlung benötigt.
– Alok Singhal
3. März 10 um 11:25 Uhr
“Die ganze Welt ist ein VAX!” Syndrom.
– David Cary
22. August 2011 um 20:30 Uhr
Hinzufügen zum Kommentar von @AlokSinghal: für GCC, wenn Sie mit kompilieren -Wextra flag erhalten Sie entsprechende Warnungen bei falschen Eingaben printf. Um die Warnung verschwinden zu lassen, müssen Sie das richtige Formular verwenden und zu werfen void* was hilfreich sein kann.
– Fred
23. Juli 18 um 22:35 Uhr
Zumindest auf einem System, das nicht sehr ungewöhnlich ist, drucken sie nicht dasselbe:
Beachten Sie, wie die Zeigerversion a hinzufügt 0x Präfix, zum Beispiel. Verwenden Sie immer %p, da es die Größe von Zeigern kennt und weiß, wie sie am besten als Text dargestellt werden.
“…das ist nicht sehr ungewöhnlich”. Schön 🙂
– Verrückter Physiker
25. Juni 18 um 23:37 Uhr
Mauritius
Darauf können Sie sich nicht verlassen %p Anzeige eines 0x Präfix. In Visual C++ ist dies nicht der Fall. Benutzen %#p tragbar sein.
PC-Lint mag es nicht, aber es funktioniert in Visual Studio. Leider wird ‘0X’ und nicht ‘0x’ vorangestellt, wodurch der tatsächliche Wert schwer lesbar ist. Vermutlich liegt dies an einer fehlenden ‘%P’-Variante. Alles in allem leidet dieser Formatbezeichner unter dem Problem aller ‘plattformabhängigen’ Implementierungen, dass Sie nicht wirklich kontrollieren können, was Sie bekommen werden. Ich benutze ‘0x%p’ auf die Gefahr hin, am Anfang ein doppeltes 0x0X zu bekommen. Untergräbt eher die Verwendung, weil Sie genau wissen, was Sie mit %x bekommen.
– Andy Krouwel
9. Januar 15 um 10:32 Uhr
Dies scheint überhaupt nicht portierbar zu sein, selbst zwischen VC-Versionen. Beispielsweise stellt VS 2013 (12.0.40629.00 Update 5) „0X“ für „%#p“ voran, hat aber kein Präfix für „%p“. Aber VC 19.00.23506 hat weder ein Präfix für „%p“ noch „%#p“. Dann setzt G++ 5.4.0 „0x“ für „%p“ und „%#p“ voran (und die Verwendung von „%#p“ gibt eine G++-Warnung aus). Kurz gesagt, Sie können sich auf das Format davon überhaupt nicht verlassen.
– James
21. Februar 19 um 11:38 Uhr
Tronik
Die Größe des Zeigers kann etwas anders sein als die von int. Auch eine Implementierung könnte eine bessere als einfache Hex-Wert-Darstellung der Adresse erzeugen, wenn Sie verwenden %p.
Philipp Ekberg
x ist Hexadezimale Ganzzahl ohne Vorzeichen (32 Bit)
p ist Zeigeradresse
Sehen printf in der C++-Referenz. Selbst wenn beide das gleiche schreiben würden, würde ich verwenden %p um einen Zeiger zu drucken.
Ja, die Seite habe ich schon durchgesehen. Was ich wissen wollte war, warum du es tun würdest use %p to print a pointer. Wie auch immer, die Antwort von Peter Hosey beantwortet meinen Zweifel.
– Möb
3. März 10 um 8:06 Uhr
Albtx
Wenn Sie debuggen müssen, verwenden Sie printf with %p Option ist wirklich hilfreich. Sie sehen 0x0, wenn Sie einen NULL-Wert haben.
Ja, die Seite habe ich schon durchgesehen. Was ich wissen wollte war, warum du es tun würdest use %p to print a pointer. Wie auch immer, die Antwort von Peter Hosey beantwortet meinen Zweifel.
– Möb
3. März 10 um 8:06 Uhr
codaddict
x wird verwendet, um das t-Zeigerargument hexadezimal auszugeben.
Eine typische Adresse beim Drucken mit %x würde aussehen wie bfffc6e4 und die vernünftige Adresse gedruckt mit %p wäre 0xbfffc6e4
Nein, %x wird verwendet, um einen Wert vom Typ zu drucken unsigned int in hexadezimal. Dafür gibt es absolut keine Garantie unsigned int ist genauso groß wie void *und es ist keine gute Idee, dies im Code anzunehmen.
– abschalten
5. Oktober 14 um 15:51 Uhr
.
7590600cookie-checkWo ist `%p` mit printf nützlich?yes
Durch die Verwendung von ‘%p’ geben Sie die Adresse der betreffenden Variablen aus: “Das void * Zeigerargument wird hexadezimal gedruckt (wie von %#x oder %#lx).”
– Benutzer1831086
3. März 10 um 10:26 Uhr
In C++ können Sie (void *) typecast verwenden: siehe stackoverflow.com/questions/5657123/…
– kagali-san
14. April 11 um 0:21 Uhr