Namespaces
Variants

std:: ptrdiff_t

From cppreference.net
Utilities library
Défini dans l'en-tête <cstddef>
typedef /*implementation-defined*/ ptrdiff_t ;

std::ptrdiff_t est le type entier signé du résultat de la soustraction de deux pointeurs.

La largeur en bits de std::ptrdiff_t n'est pas inférieure à 17.

(depuis C++11)

Table des matières

Notes

std::ptrdiff_t est utilisé pour l'arithmétique des pointeurs et l'indexation des tableaux, si des valeurs négatives sont possibles. Les programmes qui utilisent d'autres types, tels que int , peuvent échouer sur, par exemple, les systèmes 64 bits lorsque l'index dépasse INT_MAX ou s'il repose sur une arithmétique modulaire 32 bits.

Lorsque vous travaillez avec la bibliothèque de conteneurs C++, le type approprié pour la différence entre les itérateurs est le typedef membre difference_type , qui est souvent synonyme de std::ptrdiff_t .

Seuls les pointeurs vers des éléments d'un même tableau (y compris le pointeur pointant après la fin du tableau) peuvent être soustraits l'un de l'autre.

Si un tableau est si grand (plus de PTRDIFF_MAX éléments, mais moins de SIZE_MAX octets), que la différence entre deux pointeurs peut ne pas être représentable comme std::ptrdiff_t , le résultat de la soustraction de deux tels pointeurs est indéfini.

Pour les tableaux de caractères plus courts que PTRDIFF_MAX , std::ptrdiff_t agit comme la contrepartie signée de std::size_t : il peut stocker la taille du tableau de n'importe quel type et est, sur la plupart des plateformes, synonyme de std::intptr_t .

Il n'est pas spécifié si la déclaration de std::ptrdiff_t est disponible dans tout autre en-tête de la bibliothèque standard. Une implémentation peut éviter d'introduire ce nom même lorsque la norme exige l'utilisation de std::ptrdiff_t .

Implémentation possible

// valide depuis C++11
using ptrdiff_t = decltype(static_cast<int*>(nullptr) - static_cast<int*>(nullptr));

Exemple

#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;
}

Sortie :

10 9 8 7 6 5 4 3 2 1

Voir aussi

type entier non signé retourné par l'opérateur sizeof
(typedef)
décalage en octets depuis le début d'un type standard-layout jusqu'au membre spécifié
(macro fonction)
Documentation C pour ptrdiff_t