( Veuillez lire ce paragraphe avant de lire l'article.Je demande à toute personne intéressée par la lecture de cet article d'essayer de le lire attentivement, et bien sûr de ne pas le voter tant que vous ne l'avez pas compris complètement, merci. )
Il s'agit maintenant d'un wiki communautaire, en tant que tel, si quelqu'un n'est pas d'accord avec l'un des concepts, veuillez le modifier, avec une explication claire et détaillée de ce qui ne va pas et pourquoi, et si possible, veuillez citer des sources ou fournir des preuves qui peuvent être reproduites.
Répondre
Voici quelques autres raisons qui pourraient être les facteurs sous-jacents pour NULL == 0
- Le fait que zéro soit faux, donc on peut faire directement à la
if(!my_ptr)
place de if(my_ptr==NULL)
.
- Le fait que les entiers globaux non initiés soient initialisés par défaut à tous les zéros, et en tant que tel un pointeur de tous les zéros serait considéré comme non initialisé.
Ici, je voudrais dire un mot sur d'autres réponses
Pas à cause du sucre syntaxique
Dire que NULL est nul à cause du sucre syntaxique n'a pas beaucoup de sens, si oui, pourquoi ne pas utiliser l'index 0 d'un tableau pour tenir sa longueur?
En fait, C est le langage qui ressemble le plus à l'implémentation interne, est-il logique de dire que C a choisi zéro juste à cause du sucre syntaxique? Ils préfèrent fournir un mot-clé null (comme le font de nombreux autres langages) plutôt que de mapper zéro à NULL!
En tant que tel, alors qu'à partir d'aujourd'hui, il pourrait simplement s'agir de sucre syntaxique, il est clair que l'intention initiale des développeurs de langage C n'était pas pour le sucre syntaxique, comme je le montrerai plus loin.
1) La spécification
Pourtant, s'il est vrai que la spécification C parle de la constante 0 comme pointeur nul (section 6.3.2.3), et définit également NULL comme étant défini par l'implémentation (section 7.19 dans la spécification C11 et 7.17 dans la spécification C99), le il n'en reste pas moins que dans le livre "The C Programming Language" écrit par les inventeurs de C, ce qui suit est indiqué dans la section 5.4:
C garantit que zéro n'est jamais une adresse valide pour les données, donc une valeur de retour de zéro peut être utilisée pour signaler un événement anormal, dans ce cas, pas d'espace.
Le pointeur et les entiers ne sont pas interchangeables, le zéro est la seule exception: le zéro constant peut être attribué à un pointeur, et un pointeur peut être comparé au zéro constant. La constante symbolique NULL est souvent utilisée à la place de zéro, comme mnémonique pour indiquer plus clairement qu'il s'agit d'une valeur spéciale pour un pointeur. NULL est défini dans. Nous utiliserons désormais NULL.
Comme on peut le voir (à partir des mots "adresse zéro") au moins l'intention originelle des auteurs de C était de l'adresse zéro, et non de la constante zéro, il ressort d'ailleurs de cet extrait que la raison pour laquelle la spécification parle du la constante zéro n'est probablement pas d'exclure une expression évaluée à zéro, mais plutôt d'inclure la constante entière zéro comme étant la seule constante entière autorisée pour une utilisation dans un contexte de pointeur sans conversion.
2) Résumé
Alors que la spécification ne dit pas explicitement qu'une adresse zéro peut être traitée différemment de la constante zéro, elle ne dit pas que non, et le fait que lorsqu'elle traite de la constante de pointeur nul, elle ne prétend pas qu'elle est une implémentation définie comme elle fait par la constante définie NULL , prétend à la place qu'elle est zéro, montre qu'il pourrait y avoir une différence entre la constante zéro et l'adresse zéro.
(Cependant, si tel est le cas, je me demande simplement pourquoi NULL est défini par l'implémentation, puisque dans un tel cas, NULL peut également être la constante zéro, car le compilateur doit de toute façon convertir toutes les constantes zéro en l'implémentation réelle définie NULL?)
Cependant, je ne vois pas cela en action réelle, et dans les plates-formes générales, l'adresse zéro et la constante zéro sont traitées de la même manière et lancent le même message d'erreur.
De plus, le fait est que les systèmes d'exploitation actuels réservent en fait toute la première page (plage de 0x0000 à 0xFFFF), juste pour empêcher l'accès à l'adresse zéro à cause du pointeur NULL de C, (voir http://en.wikipedia.org/wiki/ Zero_page , ainsi que "Windows Via C / C ++ par Jeffrey Richter et Christophe Nasarre (publié par Microsoft Press)").
Ainsi, je demanderais à quiconque prétendant l'avoir réellement vu en action, de préciser la plate-forme, et le compilateur, et le code exact qu'il a réellement fait, (bien qu'en raison de la définition vague dans la spécification [comme je l'ai montré] tout compilateur et la plateforme est libre de faire ce qu'il veut).
Cependant, il semble apparemment que les auteurs de C n'avaient pas cela à l'esprit, et ils parlaient de "l'adresse zéro", et que "C garantit que ce n'est jamais une adresse valide", ainsi que "NULL est juste un mnémonique », montrant clairement que son intention initiale n'était pas de« sucre syntaxique ».
Pas à cause du système d'exploitation
Prétendant également que le système d'exploitation refuse l'accès à l'adresse zéro, pour plusieurs raisons:
1) Quand C a été écrit, il n'y avait pas de telle restriction, comme on peut le voir sur ce wiki http://en.wikipedia.org/wiki/Zero_page .
2) Le fait est que les compilateurs C ont accédé à l'adresse mémoire zéro.
Cela semble être le fait de l'article suivant de BellLabs ( http://www.cs.bell-labs.com/who/dmr/primevalC.html )
Les deux compilateurs diffèrent dans les détails dans la façon dont ils gèrent cela. Dans le premier, le début se trouve en nommant une fonction; dans ce dernier, le début est simplement pris à 0. Cela indique que le premier compilateur a été écrit avant que nous ayons une machine avec mappage de mémoire, donc l'origine du programme n'était pas à l'emplacement 0, alors qu'au moment du second, nous avions un PDP-11 qui fournissait une cartographie.
(En fait, à partir d'aujourd'hui (comme je l'ai cité ci-dessus dans les références de wikipedia et de microsoft press), la raison pour laquelle l'accès à l'adresse zéro est restreint est due aux pointeurs NULL de C! Donc, à la fin, il s'avère que c'est l'inverse!)
3) N'oubliez pas que C est également utilisé pour écrire des systèmes d'exploitation, et même des compilateurs C!
En fait, C a été développé dans le but d'écrire le système d'exploitation UNIX avec lui, et en tant que tel, il ne semble pas y avoir de raison pour laquelle ils devraient se limiter à partir de l'adresse zéro.
(Matériel) Explication sur la façon dont les ordinateurs sont (physiquement) capables d'accéder à l'adresse zéro
Il y a un autre point que je veux expliquer ici, comment est-il possible de référencer l'adresse zéro?
Pensez-y une seconde, les adresses sont récupérées par le processeur, puis envoyées sous forme de tensions sur le bus de mémoire, qui est ensuite utilisé par le système de mémoire pour accéder à l'adresse réelle, et pourtant une adresse de zéro signifiera pas de tension , alors comment le matériel physique du système de mémoire accède-t-il à l'adresse zéro?
La réponse semble être, que l'adresse zéro est la valeur par défaut, et en d'autres termes l'adresse zéro est toujours accessible par le système de mémoire lorsque le bus mémoire est complètement éteint, et en tant que telle, toute demande de lecture ou d'écriture sans spécifier une adresse réelle (qui est le cas avec l'adresse zéro) accède automatiquement à l'adresse zéro.
if (p != 0)
pourif (p)
lequel est un idiome courant en C et C ++, même si vous devrez sortir de cette habitude si vous prenez Java.