std::ptrdiff_t
Определено в заголовке <cstddef> | ||
|---|---|---|
typedef /*implementation-defined*/ ptrdiff_t; |
std::ptrdiff_t — это целочисленный тип со знаком, результатом вычитания двух указателей.
| Разрядность | (с 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.
Пример
#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) |
|
| байтовый смещение от начала типа стандартного размещения до указанного члена (макрос-функция) |
|
Документация C для ptrdiff_t |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/types/ptrdiff_t