Spec-Zone.ru › C++

std::ptrdiff_t

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

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

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

(начиная с 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

См. также

size_t
беззнаковый целочисленный тип, возвращаемый оператором sizeof
(typedef)
offsetof
смещение в байтах от начала типа со стандартной компоновкой 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API