ptrdiff_t
|
Definido en el encabezado
<stddef.h>
|
||
|
typedef
/*implementation-defined*/
ptrdiff_t
;
|
||
ptrdiff_t
es el tipo entero con signo del resultado de
restar dos punteros
.
|
El ancho de bits de
|
(desde C99)
(hasta C23) |
|
El ancho de bits de
|
(desde C23) |
Contenidos |
Notas
ptrdiff_t
se utiliza para aritmética de punteros e indexación de arreglos, si son posibles valores negativos. Los programas que utilizan otros tipos, como
int
, pueden fallar en, por ejemplo, sistemas de 64 bits cuando el índice excede
INT_MAX
o si depende de aritmética modular de 32 bits.
Solo se pueden restar entre sí punteros a elementos del mismo arreglo (incluyendo el puntero una posición después del final del arreglo).
Si un array es tan grande (mayor que
PTRDIFF_MAX
elementos, pero igual o menor que
SIZE_MAX
bytes), que la diferencia entre dos punteros podría no ser representable como
ptrdiff_t
, el resultado de restar dos de estos punteros es indefinido.
Para arreglos de caracteres más cortos que
PTRDIFF_MAX
,
ptrdiff_t
actúa como la contraparte con signo de
size_t
: puede almacenar el tamaño del arreglo de cualquier tipo y es, en la mayoría de plataformas, sinónimo de
intptr_t
).
Implementación posible
typedef typeof((int*)nullptr - (int*)nullptr) ptrdiff_t; // válido desde C23 |
Ejemplo
#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); }
Salida posible:
PTRDIFF_MAX = 9223372036854775807 p2-p1 = 5
Referencias
- Estándar C23 (ISO/IEC 9899:2024):
-
- 7.19 Definiciones comunes <stddef.h> (p: TBD)
-
- 7.20.3 Límites de otros tipos enteros (p: TBD)
- Estándar C17 (ISO/IEC 9899:2018):
-
- 7.19 Definiciones comunes <stddef.h> (p: 211)
-
- 7.20.3 Límites de otros tipos enteros (p: 215)
- Estándar C11 (ISO/IEC 9899:2011):
-
- 7.19 Definiciones comunes <stddef.h> (p: 288)
-
- 7.20.3 Límites de otros tipos enteros (p: 293)
- Estándar C99 (ISO/IEC 9899:1999):
-
- 7.17 Definiciones comunes <stddef.h> (p: 253)
-
- 7.18.3 Límites de otros tipos enteros (p: 258)
- Estándar C89/C90 (ISO/IEC 9899:1990):
-
- 4.1.6 Definiciones comunes <stddef.h>
Véase también
|
tipo entero sin signo devuelto por el operador
sizeof
(typedef) |
|
|
desplazamiento en bytes desde el inicio de un tipo struct hasta el miembro especificado
(macro de función) |
|
|
Documentación de C++
para
ptrdiff_t
|
|