2015-04-30 2 views
2

Я знаю, что переменное является местом хранения в паре с соответствующим символическим именем, теперь я записываю этоГде переменные? Где их ценность?

int a=8; 

Моих вопросов:

Где 8? Адрес 8 совпадает с адресом a?

+4

'8' является целым числом буквальным и' a' является переменной , –

+0

Спасибо! Но я знаю, где a находится в памяти и 8 в памяти. –

+0

Он может перейти в раздел кода или данных и может быть использован для инициализации. –

ответ

0

При объявлении переменной Int А и установить его на 8, ваш компьютер будет на самом деле зарезервируйте место в своей памяти, где оно помещено в 8. Вы можете получить фактическое местоположение (адрес памяти), назначив адрес другой переменной:

int* b = &a; 

Это присвоит адрес, где a (8) будет сохранен для новой переменной b.

Если вы используете Visual-Studio, которые предполагают ваш тег visual C++, вы также можете использовать служебные программы на борту, чтобы сделать это видимым. Откройте реестр, собрание и Debug Views

  • Debug -> Windows -> Регистры
  • Debug -> Windows -> Dissassembly
  • Debug -> Windows -> Память -> Memory1.

Переходя по вашим вызовам в разрешении, вы можете увидеть, что происходит в памяти.

я использовал немного расширенный пример вашего codeline, чтобы заставить показать Visual Studio, чтобы показать интересные происходящее:

int a = 8; 

//increment the value in a by 1 and assign it to 1 
a = a + 1; 

//Get the memory address where the 8 has been 
//stored and set it to b 
int* b = &a; 

enter image description here

+0

спасибо, очень хороший ответ! Я знал, что на самом деле мой вопрос означает, так как я узнал немного 8086 asm. –

2

утверждение является определение и инициализации переменной a. Если мы разобьем процесс в простых терминах, это выглядит как

int a=8; 
  • объявляет переменную с именем a типа int
  • определяет его (выделяет память)
  • initalizes переменную со значением 8. [FWIW, здесь 8 является int буквальным]

Там нет индивидуальный 8 присутствующая после этого. a имеет значение 8, вот и все.

+0

Как известно программе для инициализации переменной значением 8? Это 8 должно быть записано где-нибудь (например, в микроконтроллерах). – rozina

+0

У меня тот же вопрос с @rozina, продвинутые программисты не видят нашего мышления. –

+0

@rozina Код, который инициализирует переменную, - это инструкция, в которой говорится: «Сохраните номер 8 в месте xxxx». – molbdnilo

9

Переменные называются местоположением в памяти. Другими словами, переменные являются всего лишь владельцем места для значения. При объявлении

int a = 8; 

8 хранится в ячейке памяти с именем, как a. Этот цельный литерал можно получить из этой ячейки памяти, используя a.

0x12345  <--- Memory address    
+-------------+ 
|    | 
|  8  | 
|    | 
+-------------+ 
     a   <--- Name used to access value stored at location 0x12345 

Вы можете подумать об этом как о присвоении значения в поле с именем переменной.

int a = 1; 

enter image description here

+0

Я знаю только, что компьютер полон 0 и 1.so a должен иметь адрес для store.so делает 8. –

+2

@zentionshon 8 - значение. Вы можете сохранить 8 в месте, но номер 8 не имеет места. – molbdnilo

+0

Вы можете сохранить 8 в месте, но номер 8 не имеет местоположения? Почему? Я больше смущен. –

2

В двоичном пространстве

файла Когда вы говорите int a=8; в глобальном масштабе, 8 может перейти в раздел данных, который будет впоследствии использоваться для initlaize a при загрузке исполняемый файл.

Когда вы говорите int a=8; в локальной области видимости, 8 может перейти в раздел кода, который будет впоследствии использоваться для initlaize переменной a (которая может находиться в стеке сегменте процесса *), когда поток программы достигает эту строку коды ,

Для получения дополнительной информации вы можете изучить, как бинарные исполняемые файлы (например, ELF) упакованы и о разных разделах.

В пространстве процесса

Там нет ничего, как буквальное или 8, переменная a имеет адрес и 8 хранится по этому адресу. Именно по этой причине вы не можете брать адреса литералов. (&8, например, является неправильным, потому что он не имеет адрес, он хранится на каком-то месте анонимно или с переменной псевдоним, который может быть решена)

* Предполагая, что реализация использует стек для локальных переменных, которое истинно для всех которые я когда-либо видел.

+0

Спасибо! Вы имеете в виду, что a и 8 хранят другое место в памяти? И 8 находится в разделе данных или кодовом наборе? Где находится «a» магазин? –

+0

@zentionshon '8' хранится в двоичном формате. 'a' может быть или не быть сохранено буквально после компиляции. Он сохраняется, если он имеет внешнюю привязку, иначе он будет разрешен во время компиляции. И разрешенное смещение адреса при добавлении с базой времени выполнения является адресом, который мы фактически видим (печать с '% p'). Но само имя 'a' удаляется после компиляции или связывания (внутренняя/внешняя ссылка), если вам не нужна его для отладки. –

0

a - это название города.
8 - это значение, которое должно храниться в этом месте.

Код, который генерируется из int a = 8, обычно является инструкцией, в которой говорится: «Сохраните номер 8 в месте xxxx», где «xxxx» - это местоположение, выбранное для хранения a.
Таким образом, 8 обычно хранится в коде и копируется в том месте, где предполагается использовать.

(Там были платформы, которые этого не сделали, и фактически скопировали небольшие номера из определенных мест памяти. В этом случае вы могли бы сказать, что номер имеет свое местоположение, но это было очень давно .)

0

a - это переменная. Когда ваша программа запущена, она находится в ОЗУ/памяти компьютера и имеет адрес так же, как каждое значение в ОЗУ имеет адрес.

Когда работает ваша программа, 8 является скопирована в a, и, следовательно, где a находится в оперативной памяти компьютера (его адрес памяти). Местоположение памяти, указанное адресом a, теперь содержит значение от 8.

Теперь, когда ваша программа запущена, имя переменной больше не имеет значения. Он был преобразован компилятором, чтобы указать на некоторое относительное расположение памяти. И поэтому во время работы мы говорим с адресами, хотя мы (люди, а не компьютеры) сохраняем мозг, используя имя переменной, чтобы представлять это местоположение в памяти (адрес).

0

Давайте попробуем посмотреть детали низкого уровня для некоторых последовательных переменных.

int a = 8; 
char b[4] = "ABC"; 
int c = 4; 

a является переменной. Как таковой он имеет место в памяти, скажем 0x1012. Предполагая, что не неожиданный оптимизации перемещать что-нибудь здесь, как будет организована память для небольшой обратный порядок байт 32-битной системы

0x1012 8 // lowest byte of a 
0x1013 0 
0x1014 0 
0x1015 0 // highest byte of a 
0x1016 65 // (or 0x41) ASCII for A first byte of b array 
0x1017 66 
0x1018 67 
0x1019 0 // terminating null 
0x101A 4 // lowest byte for c 
0x101B 0 
0x101C 0 
0x101D 0 // highest byte for c 

Здесь можно увидеть, как, б, которые являются переменными имеют адреса в памяти, и почему 8, 4 и «abc» - значения, находящиеся в переменной.

Если позже у вас есть a=20, память изменится таким образом:

0x1012 4 // lowest byte of a 
0x1013 1 
0x1014 0 // remaining unchanged ... 

Здесь снова 20 не имеет местоположение

Смежные вопросы