, но целочисленному указателю нельзя присвоить целое число.
Не совсем. В C указателю может быть присвоено целое число при определенных условиях. Тем не менее, это только устанавливает указатель на 5, а не то, что p
указывает на int
со значением 5. *p
пытается прочитать то, что находится по адресу 5, и интерпретировать это местоположение как int
. Конечно, доступ к адресу 5 недопустим и вызывает ошибку сегмента.
Даже если эти условия соблюдены (см. Ниже), это, конечно, не то, что ищет OP, который, как я предполагаю, устанавливает указатель p
на укажите куда-нибудь со значением / типом 5
/ int
.
(int) {5}
является составным составным литералом , доступным с C99. Здесь это int
со значением 5, и код берет адрес этого объекта и присваивает этот адрес p
.
// int *p = (int)5;
int *p = & ((int) {5});
printf("%d\n", *p); // prints 5
Целое число может быть преобразовано в любой тип указателя. За исключением случаев, указанных ранее, результат определяется реализацией, может быть неправильно выровнен, может не указывать на объект ссылочного типа и может быть представлением прерывания. C17dr § 6.3.2.3 5