Пространства имён
Варианты
Действия

std::ptrdiff_t

Материал из cppreference.com
< cpp‎ | types
 
 
Библиотека метапрограммирования
Свойства типов
Категории типов
(C++11)
(C++14)  
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Свойства типов
(C++11)
(C++11)
(C++14)
(C++11)
(C++11)(до C++20*)
(C++11)(устарело в C++20)
(C++11)
Константы свойств типа
Метафункции
(C++17)
Поддерживаемые операции
Запросы отношений и свойств
Модификации типов
(C++11)(C++11)(C++11)
Преобразования типов
(C++11)(устарело в C++23)
(C++11)(устарело в C++23)
(C++11)
(C++11)
(C++17)

(C++11)(до C++20*)(C++17)
Рациональная арифметика времени компиляции
Целочисленные последовательности времени компиляции
 
Определено в заголовочном файле <cstddef>
typedef /*определено реализацией*/ ptrdiff_t;

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

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

(начиная с C++11)

[править] Примечание

std::ptrdiff_t используется для арифметики указателей и индексации массива, если возможны отрицательные значения. Программы, использующие другие типы, такие как int, могут не работать, например, на 64-битных системах, когда индекс превышает INT_MAX или если он основан на 32-битной модульной арифметике.

При работе с библиотекой контейнеров C++ правильным типом для различия между итераторами является элемент difference_type, определённый через typedef, который часто является синонимом std::ptrdiff_t.

Только указатели на элементы одного и того же массива (включая указатель, следующий за концом массива) могут вычитаться друг из друга.

Если массив настолько велик (более PTRDIFF_MAX элементов, но меньше SIZE_MAX байт), что разницу между двумя указателями нельзя представить в виде std::ptrdiff_t, результат вычитания двух таких указателей не определён.

Для массивов символов короче PTRDIFF_MAX, std::ptrdiff_t действует как знаковый аналог std::size_t: он может хранить размер массива любого типа и на большинстве платформ является синонимом std::intptr_t.

[править] Пример

#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) << ' ';
    delete[] a;
}

Вывод:

10 9 8 7 6 5 4 3 2 1

[править] Смотрите также

беззнаковый целочисленный тип, возвращаемый оператором sizeof
(определение типа) [править]
смещение в байтах от начала типа со стандартной компоновкой до указанного элемента
(функция-макрос) [править]