std::ptrdiff_t
Определён в заголовочном файле <cstddef> | ||
|---|---|---|
typedef /*implementation-defined*/ ptrdiff_t; |
std::ptrdiff_t — знаковый целочисленный тип результата вычитания двух указателей.
| Разрядность | (начиная с C++11) |
Примечания
std::ptrdiff_t используется для арифметики указателей и индексации массивов, если возможны отрицательные значения. Программы, использующие другие типы, например int, могут работать некорректно, например, в 64-разрядных системах, когда индекс превышает INT_MAX или если программа полагается на 32-разрядную модульную арифметику.
При работе с библиотекой контейнеров C++ правильным типом для разности итераторов является вложенный тип-член difference_type, который часто совпадает с std::ptrdiff_t.
Вычитать друг из друга можно только указатели на элементы одного и того же массива (включая указатель на позицию сразу за концом массива).
Если массив настолько велик (более PTRDIFF_MAX элементов, но менее SIZE_MAX байт), что разность двух указателей может быть непредставима в виде std::ptrdiff_t, результат вычитания таких указателей не определён.
Для массивов типа char короче PTRDIFF_MAX, std::ptrdiff_t выступает знаковым аналогом std::size_t: он может хранить размер массива любого типа и на большинстве платформ совпадает с std::intptr_t.
Не определено, доступно ли объявление std::ptrdiff_t в каких-либо других заголовочных файлах стандартной библиотеки. Реализация может не вводить это имя, даже если стандарт требует использовать std::ptrdiff_t.
Возможная реализация
// valid since 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) |
|
| смещение в байтах от начала типа со стандартной компоновкой standard-layout до указанного члена (макрос функции) |
|
Документация по C для ptrdiff_t |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/types/ptrdiff_t