Namespaces
Variants

std::ptrdiff_t

С сайта ru.cppreference.net
 
 
Библиотека утилит
Поддержка языка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования возможностей библиотеки (C++20)
Программные утилиты
Функции с переменным числом аргументов
Поддержка корутин (C++20)
Поддержка контрактов (C++26)
Трёхстороннее сравнение
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Общие утилиты
Операторы отношений (устарело в C++20)
Функции сравнения целых чисел
(C++20)(C++20)(C++20)    
(C++20)
Обмен и операции с типами
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общеупотребительные типы-словари
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
 
Определён в заголовке <cstddef>
typedef /*implementation-defined*/ ptrdiff_t;

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

Ширина битового представления std::ptrdiff_t не меньше 17.

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