Comment les opérateurs d'adresses travaillent en c ++

Comme le dit le dicton, “ Tout le monde doit être quelque part ”. La variable C est stocké Chaque quelque part dans la mémoire de l'ordinateur. La mémoire est divisé en différents octets, chaque octet portant sa propre adresse numéroté 0, 1, 2, et ainsi de suite.

Une variable intReader pourrait être à l'adresse 0x100, alors que floatReader pourrait être plus à l'emplacement 0x180. (Par convention, les adresses mémoire sont exprimés en hexadécimal). Bien sûr, intReader et floatReader pourrait être ailleurs dans la mémoire entièrement - que l'ordinateur ne sait pour sûr, et seulement à ce moment que le programme est exécuté.

Ceci est quelque peu analogue à un hôtel. Lorsque vous effectuez votre réservation, vous pouvez être affecté salle 0x100. Votre copain peut être affecté 80 portes vers le bas dans la chambre 0x180. Chaque variable est assignée à une adresse où il est créé.

Les deux opérateurs liés pointeurs sont présentés dans ce tableau. La opérateur dit “ me dire votre adresse, n ° 148; et * dit “ la valeur à l'adresse suivante ”.

Opérateurs Pointer
OpérateurSignification
(unaire)(Dans une expression) l'adresse de
(unaire)(Dans une déclaration) référence à
* (unaire)(Dans une expression) la chose pointé par
* (unaire)(Dans une déclaration) au pointeur

Ceux-ci ne doivent pas être confondus avec le binaire et * les opérateurs.




Ce qui suit Disposition programme démontre comment le opérateur peut être utilisé pour afficher la disposition de variables dans la mémoire:

// Mise en page - ce programme tente de donner au lecteur une idée de // de la disposition des // mémoire locale dans ses compilateur # include #comprendre #comprendre using namespace main (int nNumberofArgs, char * pszArgs []) {int start-intn- longl- long long ll flottant à double f- d- long double fin ld-int std-int - // mettre sortie en hexadécimal modecout.setf (ios :: hex) -cout.unsetf (ios :: DEC) - // sortie l'adresse de chaque // variable afin de se faire une idée de la façon dont les variables sont // énoncées dans memorycout lt; lt; "--- =" lt; lt; Démarrer 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; ré lt; lt; endl-cout lt; lt; "ld =" lt; lt; THDV; lt; endl-cout lt; lt; "--- =" lt; lt; fin lt; lt; endl - // attendre utilisateur est prêt avant le programme // mettre fin pour permettre à l'utilisateur de voir le resultscout de programme lt; lt; "Appuyez sur Entrée pour continuer ..." lt; lt; endl-cin.ignore (10, ' n') - cin.get () - retourner 0-}

Le programme déclare un ensemble de variables de types différents. Il applique ensuite la opérateur de chacun de trouver son adresse. Les résultats d'une exécution de ce programme avec Code :: Blocks apparaissent comme suit:

--- = = 0x28fefcn 0x28fef8l = 0x28fef4ll = 0x28fee8f = 0x28fee4d = 0x28fed8ld = 0x28fec0 --- = 0x28febcPress Entrée pour continuer ...

Vos résultats peuvent varier. L'adresse absolue des variables du programme dépend de beaucoup de facteurs. Le standard C ++ certainement ne précise pas comment les variables doivent être énoncées dans la mémoire.

Remarquez comment la variable n est exactement 4 octets à partir de la première variable déclarée (Démarrer), ce qui correspond à la taille d'une int (4 octets). De même, la variable l figure 4 octets vers le bas à partir de ce qui est aussi la taille d'une long.

Cependant, le flotteur variable F est un plein de 12 octets de sa variable voisin (0x28fee4 - 0x28fed8 = 0x000C). Voilà beaucoup plus que les 4 octets nécessaires pour une flotteur.

Il n'y a aucune exigence que les variables pack de compilateur C ++ le en mémoire sans espaces entre eux. En fait, vous voyez souvent ces lacunes dans la mémoire lors du mélange des variables de taille différente.

Le / compilateur gcc Code :: Blocks pourrait être stocker les variables pour son propre usage entre vos variables. Ou, plus probablement, une particularité dans la façon dont les variables sont mis en mémoire est la cause du compilateur de perdre une petite quantité d'espace.


» » » » Comment les opérateurs d'adresses travaillent en c ++