Pointeurs Null
La constante entière littérale 0
a des significations différentes selon le contexte dans lequel il est utilisé. Dans tous les cas, il est toujours une constante entière avec la valeur 0
, c'est juste décrit de différentes façons.
Si un pointeur est par rapport à la constante littérale 0
, alors c'est une vérification pour voir si le pointeur est un pointeur null. Cette 0
est alors désigné comme un pointeur null constante. La norme définit 0
cast vers le type void *
est à la fois un pointeur null et un pointeur null constante.
Par ailleurs, pour des raisons de lisibilité, la macro NULL
est fourni dans le fichier d'en-tête stddef.h
. En fonction de votre compilateur, il pourrait être possible d' #undef NULL
et de redéfinir quelque chose de loufoque. Quiconque fait cela mérite d'être fusillés.
Donc, ici, sont quelques-uns des moyens valables pour vérifier un pointeur null:
if (pointer == NULL)
NULL
est défini à comparer égale à un pointeur null. Elle est définie par l'implémentation de ce que la définition même de l' NULL
est, tant qu'il est valide d'un pointeur null constante.
if (pointer == 0)
0
est une autre représentation de pointeur null constante.
if (!pointer)
Cette if
déclaration implicitement contrôles "0", donc on inverse qui signifie "0".
Les éléments suivants ne sont pas valides façons de vérifier pour un pointeur null:
int mynull = 0;
<some code>
if (pointer == mynull)
Pour le compilateur, ce n'est pas un chèque pour un pointeur null, mais un contrôle d'égalité sur les deux variables. Cela peut fonctionner si mynull ne change jamais dans le code et les optimisations du compilateur constante plier le 0 dans l'instruction if, mais ce n'est pas garanti et que le compilateur doit produire au moins un message de diagnostic (avertissement ou erreur) selon la Norme.
Notez que ce qui est un pointeur null dans le langage C. Il n'a pas d'importance sur l'architecture sous-jacente. Si l'architecture sous-jacente a une valeur de pointeur null définie comme adresse 0xDEADBEEF, puis c'est au compilateur de trier ce gâchis.
En tant que tel, même sur cette drôle de l'architecture, de l'une des manières suivantes sont toujours valables façons de vérifier pour un pointeur null:
if (!pointer)
if (pointer == NULL)
if (pointer == 0)
Les éléments suivants ne sont pas valides façons de vérifier pour un pointeur null:
#define MYNULL (void *) 0xDEADBEEF
if (pointer == MYNULL)
if (pointer == 0xDEADBEEF)
comme ceux-ci sont vus par un compilateur comme normal comparaisons.
Les Caractères Null
'\0'
correspond à un caractère null - qui est un personnage avec tous les bits à zéro. Cela n'a rien à voir avec les pointeurs. Cependant, vous pouvez voir quelque chose de semblable à ce code:
if (!*string_pointer)
vérifie si le pointeur de la chaîne est de pointer un caractère nul
if (*string_pointer)
vérifie si le pointeur de la chaîne est de pointage à un non-caractère null
N'obtenez pas ces confondu avec des pointeurs null. Tout simplement parce que la représentation binaire est le même, ce qui permet une certaine pratique de la croix-plus de cas, ils ne sont pas vraiment la même chose.
En outre, '\0'
, à l'instar de toutes les chaînes de caractères) à une constante entière, dans ce cas, la valeur zéro. Donc, '\0'
est complètement équivalent à un sans fioritures 0
constante entière - la seule différence est dans l' intention qu'il transmet à un lecteur humain ("je suis en utilisant cela comme un caractère nul.").
Références
Voir la Question 5.3 de la comp.lang.c FAQ pour plus d'.
Voir ce document pdf pour le C standard. Découvrez les articles 6.3.2.3 Pointeurs, paragraphe 3.