Il est important de se rappeler qu' str
n'est pas vraiment une "chaîne", mais plutôt un pointeur à l'emplacement mémoire où un char
(une partie d'une chaîne de caractères) est stockée.
Ensuite, nous devons comprendre comment le compilateur voit tous ces éléments. Regardons leurs types:
-
str
est de type char *
(littéralement, "pointeur vers un char
")
-
NULL
est un pointeur null constante (au moins sur mon système, c'est ((void*)0)
)
-
'\0'
est un caractère constant (c'est en fait de type int
, mais ne vous inquiétez pas; il est généralement utilisé dans un contexte qui nécessite une char
de la valeur)
Voir l' *
en char *
et void *
? Qui indique au compilateur que ce sont les types pointeur (ce qui est une façon élégante de dire que les variables de ce type ne détiennent pas la valeur, ils ont juste à point). Ainsi, lorsque le compilateur voit char *str
, il sait ce que vous pourriez demander de faire quelque chose comme *str
ou str[0]
(dont les deux font la même chose). Nous y reviendrons plus tard.
Vous voyez, quand vous écrivez str
dans un programme en C, le compilateur sait qu'une variable appelée "str" est stocké dans un emplacement de mémoire, par exemple 0x0001. Le code qu'il génère va à 0x0001 et extrait la valeur. De cette façon, si vous faites quelque chose comme
str + 1
Ensuite, le compilateur génère un code qui ressemble à quelque chose comme:
fetch the value from where str is stored (0x0001)
add 1 to that value
Qui est quelque chose que je suis sûr que vous savez. Alors maintenant, il devrait être évident que cette ligne dit:
str == NULL
Depuis NULL
est un pointeur null constante, que les tests en ligne si str
est un pointeur null (c'est à dire, un pointeur qui ne pointe pas vers quoi que ce soit).
Ainsi, le compilateur génère en général un code comme ceci:
fetch the value from where str is stored
check if that value is 0
Souvenez-vous maintenant, si vous s'il vous plaît, que nous avons dit au compilateur qu' str
est vraiment un type pointeur. Nous sommes donc autorisés à écrire ceci:
*str
Et que fait le compilateur de générer ce:
fetch the value from where str is stored
now use that value as a memory address and fetch what is stored there
Donc, si str est tenue 0x0200, alors on obtient la valeur de l'adresse mémoire 0x0200. Notez que le compilateur n'a pas vraiment de soins si une chaîne est vraiment stockés ou non.
(Je vais supposer que vous savez qu' str[0]
est le même que *str
. Il le rend plus facile d'expliquer ce qu'il se passe.)
Comment à ce sujet, alors?
*str == '\0'
De sorte que la ligne est vraiment, en effet:
*str == (char) 0
Ce qui rend le compilateur de générer ce:
fetch the value from where str is stored
now use that value like a memory address and fetch the char that is stored there
check if the value of that fetched char is 0
Pour résumer:
- La rédaction
str == NULL
vous indique si le pointeur str
pointe à rien.
- La rédaction
*str == '\0'
vous indique si le pointeur str
pointe à une chaîne vide (en fait, pointant vers un emplacement de la mémoire la tenue d'un zéro).
(Une "chaîne" est, par définition, "une séquence contiguë de caractères terminée par et y compris le premier caractère nul", de sorte que si le premier caractère d'une chaîne est - '\0'
, alors que la chaîne est une chaîne vide.)