Переменная - это логическая конструкция, которая соответствует цели алгоритма, тогда как область памяти - это физическая конструкция, которая описывает работу компьютера. Вообще говоря, для выполнения программы (генерируется компилятором) выполняется сопоставление между логическим представлением переменной и хранилищем компьютера.
(Даже на языке ассемблера мы имеем представление о (логических) переменных, идущих к алгоритму и назначению, и (физической) ячейки памяти, хотя они более тесно связаны в сборке.)
Переменная - это концепция высокого (эр) уровня. Переменная представляет собой либо неизвестное (как в математике, или в программировании), так и заполнитель, который можно заменить значением (как в программировании: параметры).
Область памяти - это концепция низкого (эр) уровня. Место в памяти может использоваться для хранения значения, иногда для хранения значения переменной. Тем не менее, регистр ЦП является еще одним способом хранения значения некоторой переменной (переменных). Регистры ЦП также являются хранилищами низкого (эр) уровня, но они не являются ячейками памяти, так как у них нет адресов, только имена.
В некотором смысле переменная является механизмом абстракции для выражения намерения программы, тогда как ячейка памяти является физическим объектом среды обработки, которая обеспечивает хранение и поиск.
Вопрос 003: правда ли, что указатель хранится в ячейке памяти 0x23452? Зачем?
Мы не можем сказать наверняка. То, что там есть значение, которое будет работать как адрес, не означает, что это тот адрес, это может быть целое (десятичное) 144466. Мы не можем делать предположения о толковании ценностей просто исходя из того, как они выглядят численно.
Вопрос 004: правда ли, что указатель хранится в ячейке памяти 0x23452? Зачем?
Это действительно странный вопрос. Они ожидают некоторых предположений на основе блоков, однако отметим, что адреса увеличиваются на 1 для каждого блока. В любом современном компьютере это означало бы, что каждая ячейка может содержать байтово-байтовую адресацию, которая уже десятилетия является нормой. Однако байт только 8 бит и может варьироваться от 0 до 255 (для значений без знака); все же они показывают намного большее значение, сохраненное в одном из этих адресов, что очень подозрительно. (Это могло бы работать, если бы это была машина с адресом слова, но это не говорит об этом, и сегодня мало машин, хотя некоторые образовательные машины так и есть.)
Основываясь на четырех карточках, которые я вам всем показал, я бы определил указатели немного по-другому:
Указатель - это ячейка памяти, значением которой является адрес памяти другой ячейки памяти.
Хотя бывают ситуации, когда это мышление верно, вы смешиваете метафоры здесь. Понятие переменной относится к алгоритму и его намерению - нет необходимости предполагать, что все переменные имеют ячейки памяти. Некоторые переменные (особенно массивы) имеют области памяти, потому что области памяти поддерживают адресацию (тогда как регистры ЦП могут быть названы только не проиндексированными).
Для выполнения существует логическое отображение между переменными и операторами и местами памяти процессора и последовательностями команд процессора. Переменная, значение которой никогда не изменяется (например, константа), даже не обязательно требует места в памяти, поскольку значение может быть воспроизведено по желанию (например, как необходимо для последовательностей кода, сгенерированных компилятором).
a
,0x23453
.nil
и т.д. вещи внутри них являются ценностями. Это может показаться вам очевидным, но мне было бы неудобно давать решительные ответы на эти вопросы, не видя, как эти поля определены. На самом деле нет никакого способа узнать, является лиa
на втором изображении символ, строка (если они различаются) или имя переменной. Если это строка, тоnil
тоже строка? Или "нулевое" значение?