Für maximale Kompatibilität sollten Sie immer %p
verwenden und explizit nach void*
umwandeln, um Zeigerwerte mit printf
zu drucken.
Wenn der Name eines Arrays in einem anderen Ausdruckskontext als dem Operanden für sizeof
oder unary &
verwendet wird, wird er in einen Zeiger auf sein erstes Element umgewandelt.
Dies bedeutet, dass a
und &a[0]
den gleichen Typ ( int*
) und Wert haben. &a
ist die Adresse des Arrays selbst und hat den Typ int (*)[3]
. Ein Array-Objekt beginnt mit seinem ersten Element, so dass die Adresse des ersten Elements eines Arrays den gleichen Wert wie die Adresse des Arrays selbst hat, obwohl die Ausdrücke &a[0]
und &a
unterschiedliche Typen haben.
Mein C ist rostig, aber soweit ich weiß, ist & amp; a die Adresse des Anfangs des Arrays, die exakt mit & amp; a [0] übereinstimmt, da der Anfang des Arrays das erste Element ist.
Noch einmal, rostig mit C, also werde ich auf jemanden mit besserer Expertise verzichten.
Die Tatsache, dass & amp; a in diesem Fall dasselbe ist, ist eine Folge der Tatsache, dass a statisch ist. Wenn Sie einen Zeiger auf ein Array gemacht haben, dann wäre es eine andere Nummer, während die anderen beiden Ihnen das gleiche Ergebnis gaben.
Zum Beispiel:
%Vor%Eine Beispielausgabe ist:
2849911432 2849911408 2849911408
&a
ist "die Adresse des Arrays". Dies ist der Speicherort im Speicher, wo das Array ist, aber es hat einen speziellen Typ "Zeiger auf Array von".
&a[0]
ist "die Adresse des 0. Elements des Arrays". Da sich im Array vor dem 0. Element nichts befindet, ist dies derselbe Ort im Speicher, aber mit dem Typ "Zeiger auf".
a
ist "das Array". Aber Sie können Arrays nicht wirklich nach Wert an Funktionen übergeben (zB printf
) in C oder C ++. Sie können nur so tun, als ob Sie das tun. (In C ++ können Sie Arrays als Referenz übergeben, aber C hat keinen Pass-by-Reference.) Aber was wirklich passiert, ist, dass das Array in einen Zeiger auf das erste Element zerfällt, als hätten Sie &a[0]
geschrieben. .
Dies geschah, weil (ich spreche hier hauptsächlich) in C als nützlich und wünschenswert angesehen wurde, um (a) den Inhalt eines übergebenen Arrays modifizieren zu können; (b) müssen beim Aufruf einer Funktion nicht ganze Arrays auf den Stack kopieren. Also liegt Ihnen C vor und legt stattdessen einen Zeiger auf das ursprüngliche Array auf den Stack. Da die Syntax die gleiche ist, merkt man nie den Unterschied - wenn Sie a[0]
mit einem Array schreiben, das eigentlich ein Array ist, aber ein Zeiger ist, greift es auf den Speicher zu, als wäre es ein Array (ob oder nicht) es ist tatsächlich - es gibt keine Möglichkeit mehr zu erzählen). In C ++ wird das Verhalten aus Gründen der Abwärtskompatibilität beibehalten.
In C verweist der Name des Arrays auf das erste Element dieses Arrays.
Wenn Sie also &a
angeben, verweisen Sie auf die Speicheradresse dieses ersten Elements.
Tags und Links c