Я знаю, что переменное является местом хранения в паре с соответствующим символическим именем, теперь я записываю этоГде переменные? Где их ценность?
int a=8;
Моих вопросов:
Где 8
? Адрес 8
совпадает с адресом a
?
Я знаю, что переменное является местом хранения в паре с соответствующим символическим именем, теперь я записываю этоГде переменные? Где их ценность?
int a=8;
Моих вопросов:
Где 8
? Адрес 8
совпадает с адресом a
?
При объявлении переменной Int А и установить его на 8, ваш компьютер будет на самом деле зарезервируйте место в своей памяти, где оно помещено в 8. Вы можете получить фактическое местоположение (адрес памяти), назначив адрес другой переменной:
int* b = &a;
Это присвоит адрес, где a (8) будет сохранен для новой переменной b.
Если вы используете Visual-Studio, которые предполагают ваш тег visual C++, вы также можете использовать служебные программы на борту, чтобы сделать это видимым. Откройте реестр, собрание и Debug Views
Переходя по вашим вызовам в разрешении, вы можете увидеть, что происходит в памяти.
я использовал немного расширенный пример вашего 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;
спасибо, очень хороший ответ! Я знал, что на самом деле мой вопрос означает, так как я узнал немного 8086 asm. –
утверждение является определение и инициализации переменной a
. Если мы разобьем процесс в простых терминах, это выглядит как
int a=8;
a
типа int
8
. [FWIW, здесь 8
является int
буквальным]Там нет индивидуальный 8
присутствующая после этого. a
имеет значение 8
, вот и все.
Как известно программе для инициализации переменной значением 8? Это 8 должно быть записано где-нибудь (например, в микроконтроллерах). – rozina
У меня тот же вопрос с @rozina, продвинутые программисты не видят нашего мышления. –
@rozina Код, который инициализирует переменную, - это инструкция, в которой говорится: «Сохраните номер 8 в месте xxxx». – molbdnilo
Переменные называются местоположением в памяти. Другими словами, переменные являются всего лишь владельцем места для значения. При объявлении
int a = 8;
8
хранится в ячейке памяти с именем, как a
. Этот цельный литерал можно получить из этой ячейки памяти, используя a
.
0x12345 <--- Memory address
+-------------+
| |
| 8 |
| |
+-------------+
a <--- Name used to access value stored at location 0x12345
Вы можете подумать об этом как о присвоении значения в поле с именем переменной.
int a = 1;
Я знаю только, что компьютер полон 0 и 1.so a должен иметь адрес для store.so делает 8. –
@zentionshon 8 - значение. Вы можете сохранить 8 в месте, но номер 8 не имеет места. – molbdnilo
Вы можете сохранить 8 в месте, но номер 8 не имеет местоположения? Почему? Я больше смущен. –
В двоичном пространстве
файла Когда вы говорите int a=8;
в глобальном масштабе, 8
может перейти в раздел данных, который будет впоследствии использоваться для initlaize a
при загрузке исполняемый файл.
Когда вы говорите int a=8;
в локальной области видимости, 8
может перейти в раздел кода, который будет впоследствии использоваться для initlaize переменной a
(которая может находиться в стеке сегменте процесса *
), когда поток программы достигает эту строку коды ,
Для получения дополнительной информации вы можете изучить, как бинарные исполняемые файлы (например, ELF) упакованы и о разных разделах.
В пространстве процесса
Там нет ничего, как буквальное или 8
, переменная a
имеет адрес и 8
хранится по этому адресу. Именно по этой причине вы не можете брать адреса литералов. (&8
, например, является неправильным, потому что он не имеет адрес, он хранится на каком-то месте анонимно или с переменной псевдоним, который может быть решена)
*
Предполагая, что реализация использует стек для локальных переменных, которое истинно для всех которые я когда-либо видел.
Спасибо! Вы имеете в виду, что a и 8 хранят другое место в памяти? И 8 находится в разделе данных или кодовом наборе? Где находится «a» магазин? –
@zentionshon '8' хранится в двоичном формате. 'a' может быть или не быть сохранено буквально после компиляции. Он сохраняется, если он имеет внешнюю привязку, иначе он будет разрешен во время компиляции. И разрешенное смещение адреса при добавлении с базой времени выполнения является адресом, который мы фактически видим (печать с '% p'). Но само имя 'a' удаляется после компиляции или связывания (внутренняя/внешняя ссылка), если вам не нужна его для отладки. –
a
- это название города.
8
- это значение, которое должно храниться в этом месте.
Код, который генерируется из int a = 8
, обычно является инструкцией, в которой говорится: «Сохраните номер 8 в месте xxxx», где «xxxx» - это местоположение, выбранное для хранения a
.
Таким образом, 8
обычно хранится в коде и копируется в том месте, где предполагается использовать.
(Там были платформы, которые этого не сделали, и фактически скопировали небольшие номера из определенных мест памяти. В этом случае вы могли бы сказать, что номер имеет свое местоположение, но это было очень давно .)
a
- это переменная. Когда ваша программа запущена, она находится в ОЗУ/памяти компьютера и имеет адрес так же, как каждое значение в ОЗУ имеет адрес.
Когда работает ваша программа, 8
является скопирована в a
, и, следовательно, где a
находится в оперативной памяти компьютера (его адрес памяти). Местоположение памяти, указанное адресом a
, теперь содержит значение от 8
.
Теперь, когда ваша программа запущена, имя переменной больше не имеет значения. Он был преобразован компилятором, чтобы указать на некоторое относительное расположение памяти. И поэтому во время работы мы говорим с адресами, хотя мы (люди, а не компьютеры) сохраняем мозг, используя имя переменной, чтобы представлять это местоположение в памяти (адрес).
Давайте попробуем посмотреть детали низкого уровня для некоторых последовательных переменных.
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 не имеет местоположение
'8' является целым числом буквальным и' a' является переменной , –
Спасибо! Но я знаю, где a находится в памяти и 8 в памяти. –
Он может перейти в раздел кода или данных и может быть использован для инициализации. –