Wie die anderen answer von rsp sagte das Verhalten ist undefiniert und alles kann passieren.
In Ihrem Fall geschieht Folgendes:
Es ein Byte &n
liest, weil ein Zeichen von einem Byte Größe ist, die meist 8 Bit lang ist, sehen CHAR_BIT
explanation on SO. Dann druckt es es als Zeichen.
Dieses Byte könnte das erste Byte von &n
sein, wenn die Typen int*
und int
an Ihrem Computer identisch sind. Das würde bedeuten, dass Ihre Variable n
unter der Adresse 0x48...
(big-endian) oder 0x...48
(little-endian) wie 0x48
H
in der Ascci code liegt. Ich nehme an, dass Ihr Programm Ascii für die Kodierung verwendet, was nicht unbedingt notwendig ist.
(Sie verändert den Charakter H
-L
aber ich lasse diese Antwort, wie es ist.)
Auch dieses Byte irgendwo in der Mitte des &n
liegen, wenn ein int*
die Größe eines int
an Ihrem System überschreitet.
Sie sollten mit mehr Warnungen kompilieren zum Beispiel aktiviert -Wall
in gcc und Sie erhalten:
Warnung: Format '% c' erwartet Argument vom Typ 'int', aber Argument 2 hat Typ ‚int * '[-Wformat =]
im Fall werfen Sie diesen Wert auf ein char
wird das Verhalten gut, aber auf eine ganze Zahl als Abguss eines Zeigertyps über die Umsetzung verlassen definiert werden, die Umsetzung definiert.
Nichtsdestoweniger macht das, was du machst, keinen Sinn, auch mit einer Besetzung, die es nicht tut.
Da ein Zeiger kein Zeichen ist, ist dieser Code ** undefiniertes Verhalten **. Es könnte auch alles andere machen. Es ist ein zufälliger Effekt auf Ihre spezielle Umgebung, dass der Teil eines Zeigers 'printf()' auswerten wird, wenn Sie versuchen, einen Charakter zu bekommen, übersetzt in H ... –
Ich kann UB riechen. Das einzige, was passiert, ist UB. –
Hehe, so ** jetzt ** ist es plötzlich * "L"? Hast du das Gefühl, dass etwas nicht in Ordnung ist? –