std:: ptrdiff_t
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Basic types | |||||||||||||||||||||
| Fixed width integer types (C++11) | |||||||||||||||||||||
| Fixed width floating-point types (C++23) | |||||||||||||||||||||
|
|||||||||||||||||||||
| Numeric limits | |||||||||||||||||||||
| C numeric limits interface | |||||||||||||||||||||
| Runtime type information | |||||||||||||||||||||
|
|||||||||||||||||||||
|
Определено в заголовочном файле
<cstddef>
|
||
|
typedef
/*implementation-defined*/
ptrdiff_t
;
|
||
std::ptrdiff_t
— это знаковый целочисленный тип результата вычитания двух указателей.
|
Разрядность
|
(since C++11) |
Содержание |
Примечания
std::ptrdiff_t
используется для
арифметики указателей
и индексации массивов, если возможны отрицательные значения. Программы, использующие другие типы, такие как
int
, могут завершиться с ошибкой, например, в 64-битных системах, когда индекс превышает
INT_MAX
или если они полагаются на 32-битную модульную арифметику.
При работе с библиотекой контейнеров C++ правильным типом для разницы между итераторами является член-typedef
difference_type
, который часто является синонимом
std::ptrdiff_t
.
Только указатели на элементы одного и того же массива (включая указатель на элемент, следующий за последним элементом массива) могут вычитаться друг из друга.
Если массив настолько велик (больше
PTRDIFF_MAX
элементов, но меньше
SIZE_MAX
байт), что разность между двумя указателями может не быть представимой в виде
std::ptrdiff_t
, результат вычитания двух таких указателей является неопределённым.
Для символьных массивов короче, чем
PTRDIFF_MAX
,
std::ptrdiff_t
выступает в качестве знакового аналога
std::size_t
: он может хранить размер массива любого типа и на большинстве платформ является синонимом
std::intptr_t
.
Не определено, доступно ли объявление
std::ptrdiff_t
в каких-либо других заголовках стандартной библиотеки. Реализация может избегать введения этого имени даже в случаях, когда стандарт требует использования
std::ptrdiff_t
.
Возможная реализация
// корректно начиная с C++11 using ptrdiff_t = decltype(static_cast<int*>(nullptr) - static_cast<int*>(nullptr)); |
Пример
#include <cstddef> #include <iostream> int main() { const std::size_t N = 10; int* a = new int[N]; int* end = a + N; for (std::ptrdiff_t i = N; i > 0; --i) std::cout << (*(end - i) = i) << ' '; std::cout << '\n'; delete[] a; }
Вывод:
10 9 8 7 6 5 4 3 2 1
Смотрите также
|
беззнаковый целочисленный тип, возвращаемый оператором
sizeof
(typedef) |
|
|
смещение в байтах от начала
стандартно размещаемого типа
до указанного члена
(функциональный макрос) |
|
|
Документация C
для
ptrdiff_t
|
|