ptrdiff_t
|
Определено в заголовочном файле
<stddef.h>
|
||
|
typedef
/*определено реализацией*/
ptrdiff_t
;
|
||
ptrdiff_t
— это знаковый целочисленный тип результата
вычитания двух указателей
.
|
Разрядность
|
(начиная с C99)
(до C23) |
|
Разрядность
|
(начиная с 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) |
|
|
смещение в байтах от начала типа структуры до указанного члена
(функциональный макрос) |
|
|
Документация C++
для
ptrdiff_t
|
|