std::ptrdiff_t
| Definido en el archivo de encabezado <cstddef>
|
||
typedef /*definido por la implementación*/ ptrdiff_t; |
||
std::ptrdiff_t es el tipo entero con signo del resultado de restar dos punteros.
|
La anchura de bits de |
(desde C++11) |
Notas
std::ptrdiff_t se utiliza para la aritmética de punteros e indización de arrays, si son posibles valores negativos. Los programas que utilizan otros tipos, como int, pueden fallar en, p. ej., sistemas de 64 bits cuando el índice sobrepasa INT_MAX o si se basa en la aritmética modular de 32 bits.
Cuando se trabaja con la biblioteca de contenedores de C++, el tipo adecuado para la diferencia entre iteradores es la definición de tipo miembro difference_type, que a menudo es sinónimo de std::ptrdiff_t.
Solo los punteros a elementos del mismo array (incluido el puntero que se encuentra un paso más allá del final del array) se pueden restar entre sí.
Si un array es muy grande (mayor que PTRDIFF_MAX elementos, pero menor que SIZE_MAX bytes), la diferencia entre dos punteros puede no ser representable como std::ptrdiff_t , el resultado de restar dos de estos punteros no está definido.
Para arrays de caracteres de longitud más corta que PTRDIFF_MAX, std::ptrdiff_t actúa como la contraparte con signo de std::size_t: puede almacenar el tamaño del array de cualquier tipo y es, en la mayoría de las plataformas, sinónimo de std::intptr_t.
No se especifica si la declaración de std::ptrdiff_t está disponible en cualquier otro encabezado de biblioteca estándar. Una implementación puede evitar introducir este nombre incluso cuando el estándar requiere que se use std::ptrdiff_t.
Posible implementación
// válido desde C++11
using ptrdiff_t = decltype(static_cast<int*>(nullptr) - static_cast<int*>(nullptr));
|
Ejemplo
#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;
}
Salida:
10 9 8 7 6 5 4 3 2 1
Véase también
| Tipo entero sin signo devuelto por el operador sizeof. (typedef) | |
| Desplazamiento de bytes desde el comienzo de un tipo de diseño estándar al miembro especificado. (macro de función) | |
Documentación de C para ptrdiff_t
| |