Remarque: Cette réponse s'applique au langage C, pas à C ++.
Pointeurs nuls
Le littéral de constante entière 0
a des significations différentes selon le contexte dans lequel il est utilisé. Dans tous les cas, c'est toujours une constante entière avec la valeur0
, elle est juste décrite de différentes manières.
Si un pointeur est comparé au littéral constant 0
, il s'agit d'une vérification pour voir si le pointeur est un pointeur nul. Ceci 0
est alors appelé une constante de pointeur nul. La norme C définit que la 0
conversion en type void *
est à la fois un pointeur nul et une constante de pointeur nul.
De plus, pour améliorer la lisibilité, la macro NULL
est fournie dans le fichier d'en-tête stddef.h
. Selon votre compilateur, il peut être possible de le #undef NULL
redéfinir en quelque chose de farfelu.
Par conséquent, voici quelques moyens valides de rechercher un pointeur nul:
if (pointer == NULL)
NULL
est défini pour comparer égal à un pointeur nul. C'est l'implémentation définie quelle est la définition réelle de NULL
, tant qu'il s'agit d'une constante de pointeur null valide.
if (pointer == 0)
0
est une autre représentation de la constante de pointeur nul.
if (!pointer)
Cette if
instruction vérifie implicitement "n'est pas 0", donc nous inversons cela pour signifier "est 0".
Les méthodes suivantes sont INVALIDES pour rechercher un pointeur nul:
int mynull = 0;
<some code>
if (pointer == mynull)
Pour le compilateur, ce n'est pas une vérification pour un pointeur nul, mais une vérification d'égalité sur deux variables. Cela peut fonctionner si mynull ne change jamais dans le code et la constante d'optimisation du compilateur replie le 0 dans l'instruction if, mais cela n'est pas garanti et le compilateur doit produire au moins un message de diagnostic (avertissement ou erreur) selon la norme C.
Notez que ce qui est un pointeur nul dans le langage C. Peu importe l'architecture sous-jacente. Si l'architecture sous-jacente a une valeur de pointeur nulle définie comme adresse 0xDEADBEEF, alors c'est au compilateur de trier ce gâchis.
En tant que tel, même sur cette architecture amusante, les moyens suivants sont toujours des moyens valides de rechercher un pointeur nul:
if (!pointer)
if (pointer == NULL)
if (pointer == 0)
Les méthodes suivantes sont INVALIDES pour rechercher un pointeur nul:
#define MYNULL (void *) 0xDEADBEEF
if (pointer == MYNULL)
if (pointer == 0xDEADBEEF)
car ceux-ci sont vus par un compilateur comme des comparaisons normales.
Personnages nuls
'\0'
est défini comme un caractère nul - c'est-à-dire un caractère dont tous les bits sont mis à zéro. Cela n'a rien à voir avec les pointeurs. Cependant, vous pouvez voir quelque chose de similaire à ce code:
if (!*string_pointer)
vérifie si le pointeur de la chaîne pointe sur un caractère nul
if (*string_pointer)
vérifie si le pointeur de la chaîne pointe sur un caractère non nul
Ne les confondez pas avec des pointeurs nuls. Tout simplement parce que la représentation des bits est la même, et cela permet des cas de croisement pratiques, ce n'est pas vraiment la même chose.
De plus, '\0'
est (comme tous les littéraux de caractères) une constante entière, dans ce cas avec la valeur zéro. '\0'
Est donc complètement équivalent à une 0
constante entière sans fioritures - la seule différence est dans l' intention qu'elle transmet à un lecteur humain ("J'utilise ceci comme un caractère nul.").
Références
Voir la question 5.3 de la FAQ comp.lang.c pour plus d'informations. Voir ce pdf pour la norme C. Consultez les sections 6.3.2.3 Pointeurs, paragraphe 3.