In Erinnerung Ihre Arrays sieht ungefähr so aus:
+------+------+------+------+------+
| a[0] | a[1] | a[2] | a[3] | a[4] |
+------+------+------+------+------+
^ ^ ^ ^ ^
| | | | |
+------+------+------+------+------+
| p[0] | p[1] | p[2] | p[3] | p[4] |
+------+------+------+------+------+
D.h. Jedes Element von zeigt auf das entsprechende Element in a
.
Dann müssen Sie lernen, dass wenn ein Array verwendet wird, es zu einem Zeiger auf sein erstes Element zerfällt, d. H. Der Ausdruck ist dasselbe wie &p[0]
. Wenn Sie also p
ausdrucken, drucken Sie die Adresse des ersten Elements des Arrays p
aus.
Wenn Sie den Zeiger von dereferenzieren, dann tun Sie effektiv *&p[0]
. Die Dereferenzierungs- und Adressoperatoren heben sich gegenseitig auf. Wenn Sie also *p
drucken, drucken Sie p[0]
, was der Wert des ersten Elements im Array p
ist. Dieses Element, p[0]
, ist seinerseits ein Zeiger auf a[0]
. Wenn Sie also diesen Zeiger dereferenzieren (in **p
, was gleich *p[0]
ist), dann erhalten Sie den Wert a[0]
.
Auch für jedes Array oder Zeiger p
und Index i
der Ausdruck p[i]
ist die gleiche wie *(p + i)
. Daraus folgt, dass p[0]
das gleiche ist wie *(p + 0)
, was dasselbe ist wie *(p)
, was dasselbe ist wie *p
.
Daraus folgt die Logik, dass und &p[0]
die gleichen sind.
Und Ihnen wirklich zu schrauben um aufgrund der commutative property der Zugabe der Ausdruck *(p + i)
ist die gleiche wie *(i + p)
die i[p]
auf den eigentümlichen, aber gültigen Ausdruck führt. Wenn Sie einen Zeiger mit printf
drucken, sollten Sie das "%p"
Format verwenden. Es braucht ein void*
als Argument, und Sie müssen auch die Zeiger für das Programm umwandeln, um gültig zu sein.Ihr printf
Anruf sollte so aussehen:
printf ("%p %p %d\n", (void *) p, (void *) *p, **p) ;
Siehe z.B. this printf
(and family) reference für weitere Informationen.
Sie müssen ein gutes Buch lesen, keine Frage hier .. –
Sie rufen undefiniertes Verhalten auf. '% u' ist nicht der korrekte Konvertierungsbezeichner für einen Zeiger. Und 'p' ist kein Zeiger, sondern ein Array. Bitte haben Sie Verständnis dafür, dass dies keine Nachhilfeseite ist. folgen Sie @SouravGhoshs Ratschlag und schauen Sie sich die Grundlagen in Ihrem bevorzugten C-Buch an (Hinweis: Verwenden Sie mindestens einen, der C99 abdeckt, besser Standard C, d. h. C11). – Olaf
Es ist in der Regel ein guter Fall, Debugger zu verwenden, um Variablen und deren Inhalt direkt zu beobachten. – Garf365