Como Operadores endereço de trabalho em C ++
Como diz o ditado, # 147 Todo mundo tem que estar em algum lugar. # 148- Cada C ++ variável é armazenado em algum lugar na memória do computador. A memória é dividida em bytes individuais, com cada byte transportar o seu próprio endereço numeradas de 0, 1, 2, e assim por diante.
Uma variável intReader pode ser no endereço 0x100, enquanto floatReader pode ser mais no local 0x180. (Por convenção, endereços de memória são expressos em hexadecimal.) Naturalmente, intReader e floatReader pode estar em outro lugar na memória inteiramente - apenas o computador sabe ao certo e só no momento em que o programa é executado.
Isto é de alguma forma análoga a um hotel. Quando você faz a sua reserva, você pode ser designado quarto 0x100. Seu amigo pode ser atribuído 80 portas para baixo na sala de 0x180. Cada variável é atribuído um endereço quando ele é criado.
Os dois operadores de ponteiro relacionados são mostrados nesta tabela. o operador diz # Me 147 informar o seu endereço, # 148- e * diz # 147 o valor no seguinte endereço # 148.;
Operador | Significado |
---|---|
(Unário) | (Em uma expressão) o endereço do |
(Unário) | (Em uma declaração) referência a |
* (Unário) | (Em uma expressão) a coisa apontada pela |
* (Unário) | (Em uma declaração) ponteiro para |
Estes não devem ser confundidos com o binário e * operadores.
Os seguintes traçado programa demonstra como o operador pode ser usada para exibir o layout das variáveis na memória:
// Layout - este programa tenta dar ao leitor // uma ideia do layout // memória local em seus compilador # incluem#incluir #incluir usando namespace main (int nNumberofArgs, char * pszArgs []) {int start-intn- longl- long long ll-float f- dupla d- long double final ld-int std-int - // saída definida para modecout.setf hex (ios :: hex) -cout.unsetf (ios :: dec) - // saída o endereço de cada // variável para ter uma idéia de como as variáveis são // dispostos em memorycout lt; lt; "--- =" lt; lt; começar lt; lt; endl-cout lt; lt; "N =" lt; lt; n lt; lt; endl-cout lt; lt; "L =" lt; lt; eu lt; lt; endl-cout lt; lt; "Ll =" lt; lt; LBI; 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; fim lt; lt; endl - // espera até que o usuário está pronto antes de terminar o programa // para permitir que o usuário veja o resultscout programa lt; lt; "Pressione Enter para continuar ..." lt; lt; endl-cin.ignore (10, ' n') - cin.get () - retornar 0-}
O programa declara um conjunto de variáveis de diferentes tipos. Em seguida, aplica-se o operador para cada um deles para descobrir o seu endereço. Os resultados de uma execução deste programa com o Code :: Blocks aparecer da seguinte forma:
--- = 0x28fefcn = 0x28fef8l = 0x28fef4ll = 0x28fee8f = 0x28fee4d = 0x28fed8ld = 0x28fec0 --- = 0x28febcPress Enter para continuar ...
Seus resultados podem variar. O endereço absoluto de variáveis do programa depende de uma série de fatores. O padrão C ++, certamente, não especifica como as variáveis devem ser definidos na memória.
Observe como a variável n é exatamente 4 bytes da primeira variável declarada (começar), o que corresponde ao tamanho de um int (4 bytes). Da mesma forma, a variável eu aparece 4 bytes para baixo a partir desse, que é também o tamanho de um longo.
No entanto, o flutuador variável f é um total de 12 bytes de sua variável vizinha d (0x28fee4 - 0x28fed8 = 0x000c). Isso é muito mais do que os 4 bytes necessários para uma flutuador.
Não há nenhuma exigência de que o C ++ variáveis compilador bloco na memória sem espaços entre eles. Na verdade, muitas vezes você vê essas lacunas na memória quando a mistura de variáveis de tamanho diferente.
O Code :: Blocks / compilador gcc poderia estar armazenando variáveis para seu próprio uso, entre as suas variáveis. Ou, mais provavelmente, uma peculiaridade no modo como as variáveis estão sendo definidos na memória está a causar o compilador a perder uma pequena quantidade de espaço.