Zunächst müssen Sie - wie andere darauf hingewiesen haben - die richtigen Formatbezeichner verwenden und diese Werte in Pointer umwandeln.
Nun, warum alle von ihnen denselben Wert geben.
Hier ist x ein Array. Und die Art seiner Elemente sind unsigned int[3]
. d.h. x
ist ein Array von unsigned int[3]
Arrays.
Zuerst gibt x + 3
die Adresse des vierten Elements in Ihrem Array. Das ist die Adresse von {10, 11, 12}
. Die Adresse dieses Arrays im Speicher ist die Adresse seines ersten Elements im Speicher. Das ist die Adresse 10
im Speicher. Beachten Sie, dass dieser Wert int (*) [3]
ist, d. H. address of an unsigned int[3] array
.
Zweitens ist * (x + 3)
äquivalent zu x [3], das ist das vierte Element, das unsigned int[3]
ist. Es ist das Array {10, 11, 12}
. Dieser Wert zeigt auf das erste Element von Array {10, 11, 12}
. Das heißt, dieser Wert zeigt auf 10
. Beachten Sie, dass dieser Wert unsigned int[3]
ist.
Third *(x+2) + 3
: Hier *(x + 2)
entspricht x[2]
was ein unsigned int[3]
, die {7, 8, 9}
Array ist, und wenn Sie eine + 3
tun Sie wieder bekommen die Adresse 10
.Beachten Sie, dass dieser Wert unsigned int[3]
ist.
So sehen Sie in allen drei Fällen Ihr Ergebnis ist die gleiche Adresse im Speicher, d. H. Die Adresse, wo 10
gespeichert ist - auch wenn Sie verschiedene Dinge zu unterschiedlichen Zeiten darstellen; unsigned int (*)[3]
zuerst, und unsigned int[3]
an zweiter und dritter Stelle.
Die Verwendung des falschen Formatspezifizierers ist ein undefiniertes Verhalten. – mch
Wie kommt es falsch Formatbezeichner% u ist für unsigned int. –
'x + 3' hat den Typ' unsigned int (*) [3] '(ein Zeiger),' * (x + 3) 'und' * (x + 2) + 3' haben den Typ 'unsigned int *'. Alle 3 sind keine »unsigned int«, sondern Zeiger, also sollten Sie '% p' verwenden und nach' (void *) 'umwandeln. – mch