Namespaces
Variants

ptrdiff_t

From cppreference.net
< c ‎ | types
Определено в заголовочном файле <stddef.h>
typedef /*определено реализацией*/ ptrdiff_t ;

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

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

(начиная с C99)
(до C23)

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

(начиная с C23)

Содержание

Примечания

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

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

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

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

Возможная реализация

typedef typeof((int*)nullptr - (int*)nullptr) ptrdiff_t; // корректно начиная с C23

Пример

#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
int main(void)
{
    const size_t N = 100;
    int numbers[N];
    printf("PTRDIFF_MAX = %ld\n", PTRDIFF_MAX);
    int *p1 = &numbers[18], *p2 = &numbers[23];
    ptrdiff_t diff = p2 - p1;
    printf("p2-p1 = %td\n", diff);
}

Возможный вывод:

PTRDIFF_MAX = 9223372036854775807
p2-p1 = 5

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2024):
  • 7.19 Общие определения <stddef.h> (стр.: TBD)
  • 7.20.3 Границы других целочисленных типов (стр.: TBD)
  • Стандарт C17 (ISO/IEC 9899:2018):
  • 7.19 Общие определения <stddef.h> (стр: 211)
  • 7.20.3 Границы других целочисленных типов (стр: 215)
  • Стандарт C11 (ISO/IEC 9899:2011):
  • 7.19 Общие определения <stddef.h> (стр: 288)
  • 7.20.3 Пределы других целочисленных типов (стр: 293)
  • Стандарт C99 (ISO/IEC 9899:1999):
  • 7.17 Общие определения <stddef.h> (стр: 253)
  • 7.18.3 Пределы других целочисленных типов (стр: 258)
  • Стандарт C89/C90 (ISO/IEC 9899:1990):
  • 4.1.6 Общие определения <stddef.h>

Смотрите также

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