4.7 Массивы и указатели
- Результат преобразования указателя в целое число и наоборот (C90 6.3.4, C99 и C11 6.3.2.3).
При преобразовании указателя в целое число отбрасываются старшие биты, если представление указателя шире типа целого числа; выполняется расширение знака4, если представление указателя уже типа целого числа; в противном случае биты не изменяются.
При преобразовании целого числа в указатель отбрасываются старшие биты, если представление указателя уже типа целого числа; выполняется расширение в соответствии со знаковостью типа целого числа, если представление указателя шире типа целого числа; в противном случае биты не изменяются.
При преобразовании указателя в целое число и обратно полученный указатель должен ссылаться на тот же объект, что и исходный указатель, в противном случае поведение не определено. Иными словами, нельзя использовать целочисленную арифметику, чтобы избежать неопределенного поведения арифметики указателей, запрещенного в C99 и C11 6.5.6/8.
- Размер результата вычитания двух указателей на элементы одного и того же массива (C90 6.3.6, C99 и C11 6.5.6).
Значение соответствует стандарту, а тип определяется ABI.
Сноски
(4)
В будущих версиях GCC может выполняться расширение нулями или использоваться шаблон, определяемый целевой платформой ptr_extend. Не полагайтесь на расширение знака.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/Arrays-and-pointers-implementation.html