Adresse des ersten Elements in der statischen Deklaration des Arrays

8
%Vor%

Dies gibt den gleichen Wert für alle drei aus. Ich verstehe, dass a und & amp; a [0] gleich ist, aber wie ist & amp; a auch gleich?

    
Divij 24.06.2011, 19:13
quelle

5 Antworten

15

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.

    
Charles Bailey 24.06.2011, 19:20
quelle
6

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.

    
Nick Coelius 24.06.2011 19:17
quelle
4

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

    
Mikola 24.06.2011 19:17
quelle
3

&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.

    
Karl Knechtel 24.06.2011 20:14
quelle
1

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.

    
karlphillip 24.06.2011 19:20
quelle

Tags und Links