Namespaces
Variants

std:: ptrdiff_t

From cppreference.net
Utilities library
Определено в заголовочном файле <cstddef>
typedef /*implementation-defined*/ ptrdiff_t ;

std::ptrdiff_t — это знаковый целочисленный тип результата вычитания двух указателей.

Разрядность std::ptrdiff_t составляет не менее 17 бит.

(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)
смещение в байтах от начала стандартно размещаемого типа до указанного члена
(функциональный макрос)