Namespaces
Variants

std:: ptrdiff_t

From cppreference.net
Utilities library
Definido en el encabezado <cstddef>
typedef /*implementation-defined*/ ptrdiff_t ;

std::ptrdiff_t es el tipo entero con signo del resultado de restar dos punteros.

El ancho en bits de std::ptrdiff_t no es menor que 17.

(desde C++11)

Contenidos

Notas

std::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.

Al trabajar con la biblioteca de contenedores de C++, el tipo adecuado para la diferencia entre iteradores es el typedef miembro difference_type , que frecuentemente es sinónimo de std::ptrdiff_t .

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 arreglo es tan grande (mayor que PTRDIFF_MAX elementos, pero menor que SIZE_MAX bytes), que la diferencia entre dos punteros podría no ser representable como std::ptrdiff_t , el resultado de restar dos de estos punteros es indefinido.

Para arreglos de caracteres más cortos que PTRDIFF_MAX , std::ptrdiff_t actúa como la contraparte con signo de std::size_t : puede almacenar el tamaño del arreglo de cualquier tipo y es, en la mayoría de plataformas, sinónimo de std::intptr_t .

No está especificado si la declaración de std::ptrdiff_t está disponible en cualquier otro encabezado de la biblioteca estándar. Una implementación puede evitar introducir este nombre incluso cuando el estándar requiere std::ptrdiff_t para ser utilizado.

Implementación posible

// 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 en bytes desde el inicio de un tipo de diseño estándar hasta el miembro especificado
(macro de función)
Documentación de C para ptrdiff_t