Wie Adreßoperatoren Arbeiten in C ++

Wie das Sprichwort sagt, # 147-Jeder hat irgendwo sein. # 148- Jedes C ++ Variable irgendwo die im Computerspeicher gespeichert wird. Speicher in einzelne Bytes aufgebrochen, wobei jedes Byte eine eigene Adresse numeriert trägt 0, 1, 2, und so weiter.

Eine Variable intReader könnte sein, an der Adresse 0x100, während floatReader könnte sein, über am Ort 0x180. (Vereinbarungsspeicheradressen in hexadezimal ausgedrückt werden.) Natürlich, intReader und floatReader vielleicht ganz woanders in Erinnerung sein - nur weiß der Computer sicher und nur zu dem Zeitpunkt, dass das Programm ausgeführt wird.

Dies ist in gewisser Weise analog zu einem Hotel. Wenn Sie buchen, können Sie Raum 0x100 zugeordnet werden. Ihr Buddy kann unten im Raum 0x180 80 Türen zugeordnet werden. Jede Variable wird zugewiesen eine Adresse, wenn es erstellt wird.

Die beiden Zeiger bezogenen Operatoren sind in dieser Tabelle gezeigt. Das Betreiber sagt # 147-sagen Sie mir Ihre Adresse, # 148- und * sagt # 147-Wert unter der folgenden Adresse # 148.

Zeiger-Operatoren
OperatorBedeutung
(Einstellige)(In einem Ausdruck) die Adresse
(Einstellige)(In einer Erklärung) Verweis auf
* (Einstellige)(In einem Ausdruck) der Sache zeigte auf durch
* (Einstellige)(In einer Erklärung) Zeiger auf

Diese sind nicht zu verwechseln mit dem binären und * Betreiber.

Folgende Layout Programm zeigt, wie die Bediener kann das Layout der Variablen im Speicher angezeigt werden:

// Layout - dieses Programm versucht, den // Leser eine Vorstellung von der Layout // lokalen Speicher in ihrem Compiler # zu geben sind #einschließen #einschließen using namespace std-int main (int nNumberofArgs, char * pszArgs []) {int start-intn- longl- long long ll-Float-f- Doppel d- long double ld-int Ende - // Ausgang auf hex modecout.setf (ios :: hex) -cout.unsetf (ios :: Dezember) - // Ausgabe der Adresse der einzelnen Variablen //, um eine Vorstellung davon, wie Variablen zu bekommen sind // in memorycout angelegt lt; lt; "--- =" lt; lt; Anfang lt; lt; Endl-cout lt; lt; "N =" lt; lt; n lt; lt; Endl-cout lt; lt; "L =" lt; lt; l lt; lt; Endl-cout lt; lt; "Ll =" lt; lt; lllt; lt; Endl-cout lt; lt; "F =" lt; lt; f lt; lt; Endl-cout lt; lt; "D =" lt; lt; d lt; lt; Endl-cout lt; lt; "Ld =" lt; lt; LDLT; lt; Endl-cout lt; lt; "--- =" lt; lt; Ende lt; lt; Endl - // warten, bis der Benutzer bereit ist, bevor Programm beendet // dem Benutzer zu ermöglichen, das Programm resultscout zu sehen lt; lt; "Drücken Sie die Eingabetaste, um fortzufahren ..." lt; lt; Endl-cin.ignore (10, ' n') - cin.get () - Rückkehr 0-}

Das Programm erklärt eine Reihe von Variablen verschiedener Typen. Es gilt dann die Betreiber zu jeder seine Adresse herauszufinden. Die Ergebnisse einer Ausführung dieses Programms mit Code :: Blocks wie folgt aussehen:

--- = 0x28fefcn = 0x28fef8l = 0x28fef4ll = 0x28fee8f = 0x28fee4d = 0x28fed8ld = 0x28fec0 --- = 0x28febcPress eingeben, um fortzufahren ...

Ihre Ergebnisse können variieren. Die absolute Adresse von Programmvariablen hängt von einer Vielzahl von Faktoren ab. Die C ++ Standard sicherlich nicht angegeben, wie Variablen im Speicher angelegt werden.

Beachten Sie, wie Sie die Variable n ist genau 4 Bytes von der ersten Variable deklariert (Anfang), das entspricht der Größe eines int (4 Bytes). In ähnlicher Weise wird die Variable l erscheint 4 Bytes aus, dass nach unten, die auch die Größe von a lange.

Jedoch die schweben Variable f ist eine 12 Bytes aus dem benachbarten Variable d (0x28fee4 - 0x28fed8 = 0x000c). Das ist viel mehr als die 4 Byte für eine erforderliche schweben.

Es ist nicht erforderlich, dass der C ++ Compiler Pack Variablen im Speicher ohne Leerzeichen zwischen ihnen. In der Tat sieht man oft diese Lücken in den Speicher, wenn Variablen unterschiedlicher Größe zu mischen.

Der Code :: Blocks / gcc-Compiler Variablen für den eigenen Gebrauch könnte zwischen Ihren Variablen zu speichern. Oder, was wahrscheinlicher ist, in der Art und Weise eine Besonderheit die Variablen im Speicher angelegt werden verursacht, den Compiler eine kleine Menge an Speicherplatz zu verschwenden.

Menü