1: если максимальный размер массива меньше 1/2 * (максимальное число, представляемое size_t
), я могу смело использовать ptrdiff_t
и проверять относительные расстояния между двумя указателями на один и тот же объект
Так будет, если sizeof(size_t) <= sizeof(prtdiff_t)
. Это будет иметь место в разумной реализации, но нет никакой гарантии.
2: если я хочу объявить переменную, которая может представлять смещение от другого указателя, лучше объявить его как тип ptrdiff_t
?
Да, именно для этого предназначен тип.
3: Как вывести переменные типа size_t и ptrdiff_t в C и C ++?
В С:
printf("%zu %td\n", size, ptrdiff);
В C ++:
std::cout << size << ' ' << ptrdiff << '\n';
4: is uintptr_t
- это просто другое имя для size_t
ИЛИ его следует использовать как отдельный тип от size_t
?
Это следует рассматривать как отдельный тип. uintptr_t
- целочисленный тип, который может содержать любое значение указателя, преобразованное в целое число; может не существовать на некоторых платформах.
5: это ssize_t
и intptr_t
имя пыльника для ptrdiff_t
ИЛИ оно должно использоваться по-другому?
ssize_t
не является стандартным типом для языков C или C ++; он определяется Posix как тип аргументов некоторых функций и возвращаемых значений. Лучше всего использовать ptrdiff_t
, за исключением случаев, когда речь идет непосредственно о функциях Posix.
intptr_t
предназначен для хранения целочисленного представления указателя, а не разницы между указателями. На некоторых платформах они могут иметь разные размеры, и intptr_t
может вообще не определяться, поэтому их не следует использовать взаимозаменяемо.
Я хочу использовать отрицательные смещения. И какая разница в использовании uintptr_t
и intptr_t
?
Не используйте ни один из этих типов для представления смещений; используйте ptrdiff_t
. Используйте эти типы в особых случаях, когда по какой-то причине вы хотите преобразовать указатели в их целочисленные представления.