Namespaces
Variants

ptrdiff_t

From cppreference.net
< c ‎ | types
Défini dans l'en-tête <stddef.h>
typedef /*implementation-defined*/ ptrdiff_t ;

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

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

(depuis C99)
(jusqu'à C23)

La largeur en bits de ptrdiff_t n'est pas inférieure à 16.

(depuis C23)

Table des matières

Notes

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.

Seuls les pointeurs vers des éléments d'un même tableau (y compris le pointeur pointant juste 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 inférieur ou égal à SIZE_MAX octets), que la différence entre deux pointeurs peut ne pas être représentable comme 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 , ptrdiff_t agit comme la contrepartie signée de size_t : il peut stocker la taille du tableau de n'importe quel type et est, sur la plupart des plateformes, synonyme de intptr_t ).

Implémentation possible

typedef typeof((int*)nullptr - (int*)nullptr) ptrdiff_t; // valide depuis C23

Exemple

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

Sortie possible :

PTRDIFF_MAX = 9223372036854775807
p2-p1 = 5

Références

  • Norme C23 (ISO/CEI 9899:2024) :
  • 7.19 Définitions communes <stddef.h> (p: TBD)
  • 7.20.3 Limites des autres types entiers (p: TBD)
  • Norme C17 (ISO/CEI 9899:2018) :
  • 7.19 Définitions communes <stddef.h> (p: 211)
  • 7.20.3 Limites des autres types entiers (p: 215)
  • Norme C11 (ISO/IEC 9899:2011) :
  • 7.19 Définitions communes <stddef.h> (p: 288)
  • 7.20.3 Limites des autres types entiers (p: 293)
  • Norme C99 (ISO/CEI 9899:1999) :
  • 7.17 Définitions communes <stddef.h> (p: 253)
  • 7.18.3 Limites des autres types entiers (p: 258)
  • Norme C89/C90 (ISO/CEI 9899:1990) :
  • 4.1.6 Définitions communes <stddef.h>

Voir aussi

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