Что они подразумевают под этим? Что означает преобразование нуля в указатель соответствующего типа? Можно ли преобразовать значение типа?
В этом вопросе/ответе объясняется связь между нулевым двоичным значением и нулевым указателем: stackoverflow.com/questions/69211439/…





Это просто означает, что компилятор C должен обрабатывать буквальное целочисленное значение 0, чтобы указать указатель NULL.
то есть
int * x = 0;
и
int * x = NULL;
... гарантированно эквивалентны даже на необычном оборудовании, где адрес, на который указывает NULL-указатель, на самом деле не является нулевым адресом.
Что означает преобразование нуля в указатель соответствующего типа?
Целочисленная константа ноль обрабатывается особым образом; когда он преобразуется в указатель, результатом является нулевой указатель. Нулевой указатель — это специальное значение, означающее, что указатель не указывает ни на какой объект или функцию.
Можно ли преобразовать значение типа?
Преобразования в C — это преобразования типов. Как правило, преобразование — это функция или операция, которая принимает значение одного типа и возвращает такое же значение другого типа, если это возможно. (Если значение не может быть представлено в результирующем типе, преобразование должно в каком-то смысле давать ближайшее представимое значение.)
Например, когда значение int три преобразуется в short, результат равен трем. Когда он преобразуется в float, результат равен трем. Когда значение float 3,5 преобразуется в int, результат не может быть 3,5, поскольку 3,5 не может быть представлено в int. Вместо этого создается число три, которое является ближайшим представимым значением в направлении к нулю.
Когда ноль преобразуется в указатель, его значение «ничего» сохраняется, поскольку результирующий указатель, нулевой указатель, указывает на «ничего».
«… Значение 0 — это единственное целочисленное значение, которое можно присвоить непосредственно переменной-указателю».
Это не очень хорошо сказано. Технически это не правильно. Правила стандарта C для оператора присваивания рассматривают постоянное целочисленное значение нуля как особое и позволяют присваивать его указателю без предупреждения. Это сделано для того, чтобы указатели могли быть установлены на нулевое значение указателя с кодом, подобным p = 0;.
Утверждение неверно, потому что это верно только для целочисленных констант. В int x = 0; char *p = x;x не подлежит этому специальному обращению, так как это переменная, а не константа. Правила стандарта C требуют, чтобы реализация C выдавала для этого диагностическое сообщение.
Целые числа, отличные от нуля, могут быть преобразованы в тип указателя с помощью приведения. Стандарт C не полностью определяет, как работают эти преобразования. В частности, когда непостоянное выражение с нулевым значением преобразуется в указатель, стандарт не гарантирует, что он создаст нулевой указатель. Это происходит в большинстве реализаций C, но стандарт C не требует этого. Большинство реализаций C определяют преобразования между целыми числами и указателями для работы обычным способом, который вы ожидаете от схемы адресации памяти основного оборудования. В таких реализациях вы можете преобразовать целочисленное значение, являющееся адресом памяти, в указатель, и результатом будет указатель на этот адрес. Однако правила использования таких преобразований несколько усложняются, если принять во внимание все правила стандарта C.
Большое спасибо! 😊
Кратко:
0, (void*)0) или какое-либо другое выражение времени компиляции, приводящее к постоянному выражению с нулевым значением (например, 0L или 0+0 и т. д.).stddef.h предоставляет заранее созданную константу нулевого указателя NULL, которая является предпочтительным и самодокументированным способом превратить что-либо в нулевой указатель или использовать при проверке, является ли что-либо нулевым указателем.nullptr, имеющее в основном то же значение и функцию, что и NULL, хотя оно доступно без включения какого-либо заголовка.)«Язык-адвокат»/грязные подробности:
Что касается преобразований, то во время инициализации и/или присвоения переменных применяются «правила простого присвоения», найденные в стандарте C в C17 6.5.16.1, где говорится одно такое правило допустимого присвоения (выделено мной):
- левый операнд представляет собой атомарный, квалифицированный или неквалифицированный указатель, а правый — константу нулевого указателя.
Поскольку это допустимая форма присваивания, следующее правило преобразования:
В простом присваивании (
=) значение правого операнда преобразуется в тип присваивания выражение и заменяет значение, хранящееся в объекте, обозначенном левым операндом.
Фактическое преобразование затем описано в C17 6.3.2.3:
Целочисленное константное выражение со значением
0или такое выражение, приведенное к типуvoid *, называется константой нулевого указателя. Если константа нулевого указателя преобразуется в тип указателя, результирующий указатель, называемый нулевым указателем, гарантированно будет сравниваться с неравным указателю на любой объект или функцию.Преобразование нулевого указателя в другой тип указателя дает нулевой указатель этого типа. Любые два нулевых указателя должны сравниваться как равные.
Ваш ответ полезен. Большое спасибо.
Это означает, что вы можете написать
int *p = 0;, но неint *p = 5;