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.;

Operadores de ponteiro
OperadorSignificado
(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.

menu