Il y a deux volets à votre question. Je vais commencer par:
Si cela est vrai, cela voudrait dire que la valeur 0 peut être utilisée en toute sécurité, même pour les architectures qui ont non nulle d'une valeur de pointeur NULL.
Vous mélangez "valeur" et de "représentation". La valeur d'un pointeur null est appelé la valeur de pointeur null. La représentation est les bits de mémoire qui sont utilisés pour stocker cette valeur. La représentation d'un pointeur null peut être n'importe quoi, il n'est pas nécessaire que c'est tous les bits à zéro.
Dans le code:
char *p = 0;
p
est garanti pour être un pointeur null. Il pourrait ne pas avoir tous les bits à zéro.
Ce n'est pas plus "magique" que le code:
float f = 5;
f
n'ont pas la même représentation (bit-modèle en mémoire) que l'int 5
n', mais il n'y a pas de problème.
Le standard C++ définit ce. Le texte quelque peu changé en C++11 avec l'ajout d' nullptr
; cependant, dans toutes les versions de C et C++, l'entier littéral 0
lors de la conversion d'un pointeur de type génère un pointeur null.
À Partir De C++11:
Un pointeur null constante est un élément constant de l'expression prvalue de type entier qui prend la valeur zéro ou un prvalue de type std::nullptr_t. Un pointeur null constante peut être converti en un type pointeur; le résultat est la valeur de pointeur null de ce type et se distingue de tous les autres de la valeur de l'objet pointeur de fonction ou de type pointeur. Une telle conversion est appelé un pointeur null conversion.
0
est un pointeur null constante, et (char *)0
, par exemple, est un pointeur null valeur de type char *
.
Il est indifférent qu'un pointeur null a tous les bits à zéro ou pas. Ce qui importe, ce est que un pointeur null est garanti d'être généré lorsque vous convertissez une partie intégrante constexpr de valeur 0
d'un type pointeur.
Le déplacement sur l'autre partie de votre question. Le texte que vous avez cité est complet ordures à travers et à travers. Il n'y a pas de "magie" dans l'idée que la conversion entre les types de résultats dans une représentation différente, comme je l'ai discuter ci-dessus.
Le code my_char_ptr == NULL
est garanti pour tester si oui ou non my_char_ptr
est un pointeur null.
Il serait mal si vous écrivez dans votre propre code source, #define NULL (void*)0
. C'est parce que c'est un comportement indéterminé de définir une macro qui pourrait être défini par un en-tête standard.
Toutefois, la norme en-têtes peuvent écrire ce qu'ils veulent, de sorte que les exigences de la Norme pour les pointeurs null sont remplies. Les compilateurs de "magie" dans l'en-tête standard code; par exemple il ne doit pas être un fichier appelé iostream
sur le système de fichiers; le compilateur peut voir #include <iostream>
puis sont codées en dur toutes les informations que la Norme exige iostream
publier. Mais pour des raisons pratiques évidentes, les compilateurs n'ont généralement pas le faire; ils permettent d'envisager la possibilité pour les équipes afin de développer la bibliothèque standard.
De toute façon, si un compilateur C++ inclut #define NULL (void *)0
dans son propre en-tête, et comme un résultat de quelque chose de non-conformité est le cas, alors le compilateur serait non-conforme, évidemment. Et si de rien non conforme arrive, alors il n'y a pas de problème.
Je ne sais pas qui est le texte que vous citez de diriger son "c'est mal" commentaire. Si elle est destinée au compilateur de vendeurs en leur disant de ne pas être "mal" et mettre hors d'état de non-conformité des compilateurs, je suppose qu'on ne peut pas argumenter avec ça.