¿Cómo funcionan los operadores de dirección en c ++
Como dice el refrán, " Todo el mundo tiene que estar en alguna parte ". Cada variable de C ++ se almacena en algún lugar de la memoria del ordenador. La memoria se divide en bytes individuales, con cada byte llevar su propia dirección numerados 0, 1, 2, y así sucesivamente.
Una variable intReader podría ser en la dirección 0x100, mientras que floatReader podría ser mayor en la localización 0x180. (Por convención, las direcciones de memoria se expresan en hexadecimal). Por supuesto, intReader y floatReader podría estar en otro lugar en la memoria por completo - sólo el equipo sabe a ciencia cierta y sólo en el momento en que se ejecuta el programa.
Esto es algo análogo a un hotel. Al realizar su reserva, usted puede asignar sala de 0x100. Tu amigo puede ser asignado 80 puertas más abajo en la sala de 0x180. Cada variable se le asigna una dirección cuando se crea.
Los dos operadores relacionados con puntero-se muestran en esta tabla. los operador dice " dígame su dirección, " y * dice " el valor en la siguiente dirección ".
Operador | Significado |
---|---|
(unario) | (En una expresión) la dirección de |
(unario) | (En una declaración) referencia a |
* (unario) | (En una expresión) lo señaló por |
* (unario) | (En una declaración) puntero a |
Estos no deben ser confundidos con el binario y * los operadores.
El seguimiento Diseño programa demuestra cómo el operador puede ser usado para mostrar la disposición de las variables en la memoria:
// Diseño - este programa trata de dar al lector // una idea de la distribución de // la memoria local en sus compilador # include#include #include utilizando main (int nNumberofArgs, char * pszArgs []) {int-std int espacio de nombres puesta en intn- longl- largo, largo ll-float f- doble largo ld-int final doble d- - Salida // establecer a modecout.setf hexagonal (ios :: hex) -cout.unsetf (ios :: dec) - // salida la dirección de cada // variable para tener una idea de cómo las variables se // colocan en memorycout lt; lt; "--- =" lt; lt; Empezar 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; TLBI; 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; THDV; lt; endl-cout lt; lt; "--- =" lt; lt; fin lt; lt; endl - // espera hasta que el usuario esté listo antes del programa // terminar para permitir al usuario ver el resultscout programa lt; lt; "Pulse Intro para continuar ..." lt; lt; endl-cin.ignore (10, ' n') - cin.get () - volver 0-}
El programa declara un conjunto de variables de diferentes tipos. Se aplica entonces la operador para cada uno de ellos para saber su dirección. Los resultados de una ejecución de este programa con Code :: Blocks aparecen como sigue:
--- = = 0x28fefcn 0x28fef8l = 0x28fef4ll = 0x28fee8f = 0x28fee4d = 0x28fed8ld = 0x28fec0 --- = 0x28febcPress Intro para continuar ...
Sus resultados pueden variar. La dirección absoluta de las variables del programa depende de muchos factores. El estándar C ++ ciertamente no especifica cómo las variables se establece en la memoria.
Observe cómo la variable n es exactamente 4 bytes de la primera variable declaradas (Empezar), que se corresponde con el tamaño de un int (4 bytes). Del mismo modo, la variable l aparece 4 bytes abajo de eso, que es también el tamaño de una largo.
sin embargo, el flotador variable F es un total de 12 bytes desde su variable vecina d (0x28fee4 - 0x28fed8 = 0x000c). Eso es mucho más de los 4 bytes necesarios para una flotador.
No hay ningún requisito que el C ++ las variables paquete compilador en la memoria, sin espacios entre ellos. De hecho, a menudo se ve estos vacíos en la memoria cuando se mezclan las variables de diferente tamaño.
El / compilador gcc Code :: Blocks podría almacenar variables para su propio uso entre sus variables. O, más probablemente, una peculiaridad de la forma se colocan las variables en la memoria está causando el compilador que perder una pequeña cantidad de espacio.