Vous pouvez créer un pointeur à partir d'un entier avec reinterpret_cast
.
Cependant, un pointeur qui ne pointe pas vers un objet existant (ou qui dépasse le dernier élément d'un tableau, un objet étant considéré comme le seul élément d'un tableau imaginaire dans ce but, ou qui est le pointeur nul) a une valeur de pointeur invalide. Le déréférencement est UB et d'autres opérations avec des valeurs de pointeur invalides sont spécifiques à l'implémentation. Vous devez donc vous assurer que votre compilateur autorise les opérations que vous effectuez avec ces pointeurs.
void* p = reinterpret_cast<void*>(0x1000); // invalid pointer,
// operations on it are implementation defined
§6.7.2 Types de composés [basic.compound].
-
[...] Chaque valeur du type pointeur est l'une des suivantes :
3.1 - un pointeur vers un objet ou une fonction (on dit que le pointeur pointe vers l'objet ou la fonction), ou
3.2 - un pointeur au-delà de la fin d'un objet (8.5.6), ou
3.3 - la valeur du pointeur nul (7.11) pour ce type, ou
3.4 - une valeur de pointeur invalide
§8.5.1.10 Réinterpréter le cast [expr.reinterpret.cast]
- Un pointeur peut être explicitement converti en tout type intégral suffisamment grand pour le contenir. La fonction de conversion est définie par l'implémentation. [...]
- Une valeur de type intégral ou de type énumération peut être explicitement convertie en un pointeur. Un pointeur converti en un entier de taille taille suffisante (s'il en existe un sur l'implémentation) et en retour à le même type de pointeur aura sa valeur originale ; les mappages entre les pointeurs et les entiers sont autrement définis par l'implémentation.
Vous êtes autorisé à convertir un entier en pointeur, mais si la valeur du pointeur résultant ne pointe pas vers un objet existant (ou un objet passé), le pointeur résultant a une valeur invalide.
Maintenant, en ce qui concerne ce que vous pouvez faire avec des pointeurs invalides :
§6.6.4 Durée de stockage [basic.stc].
- [...] L'orientation à travers une valeur de pointeur invalide et le passage d'une valeur de pointeur invalide à une fonction de désallocation sont indéfinis. indéfini. Toute autre utilisation d'une valeur de pointeur non valide a un comportement défini par l'implémentation 35
35) Certaines implémentations pourraient définir que la copie d'un pointeur invalide invalide provoque une erreur d'exécution générée par le système.
Ce message a été fortement modifié car il était erroné dans ses premières itérations. Je remercie chaleureusement la communauté de m'avoir corrigé et mis au défi.