int aPtr = &a;
объявляет объект с именем aPtr
с типом int
, поэтому это не указатель.
Что еще хуже, sizeof(int) != sizeof(int *)
на нескольких распространенных платформах (например, во всех 64-разрядных версиях Windows начиная с Windows XP), так что вы потеряете некоторую информацию, содержащуюся в указателе, возможно, сделав сохраненное значение бесполезным.
Однако, если он работает, aPtr
по-прежнему является объектом типа int
, поэтому вы не можете использовать косвенное указание для получения значения, хранящегося по адресу в aPtr
, то есть выражение *aPtr
будет не компилируется. Ничто не мешает вам привести aPtr
к правильному типу указателя:
int a = 5;
int aPtr = &a;
printf("%i", *(int *)aPtr);
Опять же, это предполагает, что aPtr
хранит полный адрес a
. В любом случае, это всего лишь безопасность типов в игре, и это хорошо (см. sizeof(int) != sizeof(int *)
параграф выше).
Если под «концептуально» вы подразумеваете «если адрес правильно хранится в aPtr
», в вашем коде нет ничего плохого, кроме того факта, что он недопустим в C, как показано в приведенном выше примере приведения. Если адрес был 0x80, вы можете даже сохранить его в крошечном unsigned char
объекте, если хотите. Он хранится по этому адресу в памяти, независимо от того, что С не позволяет вам делать с ним, отказываясь компилировать синтаксически неверный код. Конечно, гораздо проще просто использовать правильный тип переменной, вместо того, чтобы бороться с компилятором и приводить вещи.
С другой стороны, вы можете спросить: "Если &a
хранится в aPtr
, почему компилятор не может распознать это и просто понять, что *aPtr
означает то же самое, что и *&a
?" Если это вопрос, то ответ прост: как только вы сохраняете &a
в объекте некоторого типа T
, компилятор понимает, что этот объект используется для хранения значений типа T
, и все. Он не знает, что он содержит адрес памяти, независимо от того, сохранен ли он в этом объекте или нет; он просто знает, что внутри него хранится значение типа T
. Опять же, это просто система типов C., работающая как задумано.