2016-07-22 9 views
0

ich hier bin auf der Suche und ich versuche, seine Schnipsel zu verstehen, warum die Art und Weise verhält es tutWie genau funktioniert ein Verweis auf ein Array? an einem einzigartigen Beispiel

// uninitialized mem 
char test[99999]; 


// 
test[0] = 'a'; 
test[1] = 'b'; 
test[2] = 'c'; 
test[3] = 'd'; 
test[4] = 'e'; 
test[5] = 'f'; 
test[6] = 'g'; 


for (int i = 0; i < 99999; i++) { 
    cout << (&test[i])[i] << endl; 
} 

Insbesondere was für die Ausgabe im Speicher geschieht um ein Zeichen zu überspringen?

output: 
a 
c 
e 
g 
.. 
+1

'&' ist ein Adressoperator hier. – LogicStuff

Antwort

3

Dies ist, was passiert: Ein Array ist nur ein zusammenhängender Teil des Speichers.

&test 

Ermittelt die Adresse dieses Indexes vom Startpunkt des Arrays. Nicht der Wert.

Wenn Sie [eine Zahl] hinzufügen, wird die Anzahl der Größe des Datentyps gezählt, in diesem Fall ist jedes Zeichen ein Byte. So

wenn Sie das tun

&test[i] 

, das bedeutet, die Startadresse + i Bytes.

wenn Sie das tun

(&test[i])[i] 

Sie tun i Bytes von der Startadresse, und dann behandeln, dass als Startadresse und gehen bis ich mehr Bytes.

Also in Ihrer Iteration:

(&test[0])[0] // index 0 + 0 = 0 
(&test[1])[1] // index 1 + 1 = 2 
(&test[2])[2] // index 2 + 2 = 4 
(&test[3])[3] // index 3 + 3 = 6 
+2

Diese Antwort legt nahe, dass "& test [i]' "(& test) [i]' bedeutet. Es tut es nicht. Es bedeutet '& (test [i])'. Es gibt kein '& test', auf das' [i] 'angewendet wird. – hvd

+0

Sie können die gesamte Dereferenz der Arrays in Klammern umbrechen und sie als Startzeiger zählen. (& (& test [i]) [i]) [0], und (& (& test [i]) [i]) [0]) [0] geben Sie das gleiche Ergebnis – brianxautumn

+0

@brianxautumn In Ihrem letzten Absatz haben Sie '1 + 1 = 1'. Ich habe versucht zu editieren, aber Änderungen müssen mindestens 6 Zeichen lang sein ..... das könntest du aber beheben. – Andrew

3

Es sollte etwas offensichtlicher werden, wenn man bedenkt, was die Array-Indizierung tatsächlich macht.

Bei einem Array test greifen Sie normalerweise auf das n Element von test mit test[n] zu. Dies entspricht jedoch tatsächlich *(test+n). Dies liegt daran, dass die Addition von Zeigern automatisch die Menge multipliziert, die Sie hinzufügen, mit der Größe des Typs, auf den verwiesen wird. Dies bedeutet, dass der Zeiger dann auf das zweite Element im Array zeigt, wenn Sie dem Zeiger ein Element hinzufügen, das dritte Element, wenn Sie zwei hinzufügen, und so weiter.

Der Code, den Sie angeben, verweist dann auf diesen Wert, sodass Sie mit enden. Die Funktionen (&) und die Dereferenzierung (*) löschen sich dann gegenseitig aus, was bedeutet, dass Sie nur mit test+n enden.

Der Code führt dann einen anderen Array-Index für diesen Wert aus, sodass Sie mit (test+n)[n] enden, der wiederum als *((test+n)+n) geschrieben werden kann. Wenn Sie das vereinfachen, erhalten Sie *(test+n+n), die als *(test+2*n) umgeschrieben werden kann.

Klar, dann, wenn Sie das zurück in Array Indizierung Notation konvertieren, Sie am Ende mit test[2*n], die in einfacher Form angibt, dass Sie jedes andere Element des Arrays abfragen wird.