Кажется, вы думаете, (int *)1
создает адрес, где хранится значение 1.Это не так.
Когда приведение типа (int *)
используется для преобразования целого числа в указатель, обычно получается, что значение превращается в адрес. 1
Таким образом, int *i = (int *)1;
устанавливает i
для указания адреса 1. Затем, при попытке вывести *i
, ваша программа потерпела крах, потому что 1 не был действительным адресом памяти.(Как правило, первая страница памяти остается неотображенной, поэтому неправильное использование нулевого указателя приведет к сбою и выявит проблему, а не позволит программе продолжить выполнение с неверными данными.)
Для установки i
чтобы указать int
со значением 1, вы должны установить для него адрес int
объекта со значением 1. Один из способов сделать это:
int n = 1;
int *i = &n;
Вы также можетесоздайте неназванный int
со значением 1, используя составной литерал:
int *i = & (int) { 1 };
. (int) { 1 }
создает составной литерал со значением 1, а &
получает его адрес, а затем i
инициализируется по этому адресу.
Сноска
1 В соответствии со стандартом C результат определяется реализацией.Таким образом, компилятор может определить любой результат, который он хочет.Однако каждый компилятор C, который я видел, так или иначе превращает целочисленное значение в адрес.Полученный адрес не обязательно допустим для использования для доступа к объекту.