Я не уверен, что полностью понимаю вопрос, но подозреваю, что вы делаете некоторые неявные предположения относительно указателей, которые не соответствуют действительности.
Вы задаетесь вопросом, почему C ++ «заставляет указатели указывать на слот памяти, а не только на определенное значение, которое вы можете изменить позже». Но слот в памяти - фактически единственное действительное место для хранения значения! Разумно сказать, что все данные в вашей программе хранятся в огромной группе слотов. Это как огромный массив.
Память и ценности очень тесно переплетены. Вы не можете иметь один без другого, и нет другого способа хранить вещи (кроме, может быть, хранения на диск - и да, есть и регистры, но C / C ++ их абстрагирует).
Я также хочу сказать, как вы говорите: «Казалось бы, вы хотели бы иметь возможность динамически создавать новую переменную в том самом слоте памяти, который занимает ваш указатель».
Место, которое занимает указатель, заполняется адресом, где находится значение указателя (где он «указывает»). Если бы вы создали новую переменную в этом слоте, вы бы потеряли все знания о том, куда указывает указатель! Поэтому важно, чтобы в этом слоте памяти было необходимое нам значение.
"Это потому, что операционная система создает все динамические переменные в куче, и нам нужен способ их найти, потому что наш указатель создается при загрузке программы?"
Я не совсем уверен, что вы подразумеваете под "динамической переменной", но нет, не все указатели хранятся в куче. Простой пример:
int a = 5;
int *b = &a;
Обратите внимание, что b - это указатель, который указывает на a, но и a
, и b
находятся в стеке, а не в куче.
Если под динамическим вы имеете в виду «созданный с помощью new
», то да, будет справедливо сказать, что все вещи, созданные с помощью новых, создаются в куче.
Еще одно важное замечание: операционная система (как правило) не управляет распределением памяти. Максимум, что он сделает, - это даст вам большой кусок памяти, чтобы делать все, что вы захотите. Если вам интересно, проверьте подпрограмму C под названием malloc
, которая является способом выделения памяти в куче, очень похоже на new
. За этим на самом деле не так много магии.