Quelle est la différence entre un pointeur nul & a pointeur vide?
Un pointeur nul est un spécial réservé valeur d'un pointeur. Un pointeur de tout type a une telle valeur réservée. Formellement, chaque type de pointeur spécifique (int *
, char *
etc.) a sa propre valeur null-pointeur dédiée. Conceptuellement, lorsqu'un pointeur a cette valeur NULL, il ne pointe nulle part.
Le pointeur vide est un pointeur spécifique type - void *
- un pointeur qui pointe vers un emplacement de données stocké, qui n'a pas de type spécifique.
Donc, encore une fois, pointeur nul est un valeur, tandis que pointeur vide est un type. Ces concepts sont totalement différents et non comparables. Cela signifie essentiellement que votre question, comme indiqué, n'est pas tout à fait valide. C'est comme demander, par exemple, "Quelle est la différence entre un triangle et une voiture?".
Ce sont deux concepts différents: "le pointeur de vide" est un type (void *). "pointeur null" est un pointeur qui a une valeur de zéro (NULL). Exemple:
void *pointer = NULL;
C'est un pointeur vide.
Il est garanti qu'un pointeur NULL ne se compare pas à un pointeur. Sa valeur réelle dépend du système et peut varier en fonction du type. Pour obtenir un pointeur null int
que vous feriez
int* p = 0;
Un pointeur nul sera retourné par malloc
en cas d'erreur.
Nous pouvons tester si un pointeur est null, c'est-à-dire si malloc
ou une autre fonction a échoué simplement en testant sa valeur booléenne:
if (p) {
/* Pointer is not null */
} else {
/* Pointer is null */
}
Un pointeur vide peut pointer vers n'importe quel type et il vous appartient de gérer la quantité de mémoire utilisée par les objets référencés aux fins de déréférencement et d'arithmétique de pointeur.
Le vide se réfère au type. Fondamentalement, le type de données sur lequel il pointe est inconnu.
Null fait référence à la valeur. C'est essentiellement un pointeur vers rien, et l'utilisation est invalide.
Un pointeur nul indique la valeur NULL
qui est généralement égale à 0, mais dans tous les cas, un emplacement de mémoire non valide pour une déréférence. Un pointeur vide indique des données de type vide. Le mot "void" n'indique pas que les données référencées par le pointeur sont invalides ou que le pointeur a été annulé.
Généralement, un pointeur null (qui peut être de n'importe quel type, y compris un pointeur vide!) Indique:
l'adresse 0, à laquelle la plupart des jeux d'instructions de processeurs peuvent effectuer une comparaison et une branche très rapides (pour vérifier les pointeurs non initialisés ou invalides, par exemple) avec une taille/performance de code optimale pour ISA.
adresse interdite d'accès au code utilisateur (telle que 0x00000000 dans de nombreux cas). Ainsi, si un code tente réellement d'accéder aux données situées à proximité ou à proximité de cette adresse, le système d'exploitation ou le débogueur peuvent facilement arrêter ou intercepter un programme avec ce bogue.
Un pointeur vide est généralement une méthode de triche ou de désactivation de la vérification du type du compilateur, par exemple si vous souhaitez renvoyer un pointeur sur un type ou un type inconnu à utiliser comme autre type. Par exemple, malloc () renvoie un pointeur vide sur un bloc de mémoire sans type, dont vous pouvez utiliser le type, que vous pourrez utiliser ultérieurement comme pointeur sur des octets, des raccourcis, des doubles-floats, des typesPotato, etc.
NULL
est une valeur valable pour tout type de pointeur. Cela représente l'absence de valeur.
Un pointeur vide est un type. Tout type de pointeur est convertible en un pointeur vide, il peut donc pointer sur n'importe quelle valeur. Cela le rend bon pour le stockage général mais mauvais pour l'utilisation. En soi, il ne peut pas être utilisé pour accéder à une valeur. Le programme doit avoir un contexte supplémentaire pour comprendre le type de valeur auquel se réfère le pointeur vide avant de pouvoir accéder à la valeur.
Les pointeurs nuls et les vides sont complètement différents les uns des autres. Si nous demandons au système d'exploitation (via malloc () in c langauge) d'allouer de la mémoire pour un type de données particulier, il alloue de la mémoire en tas (si l'espace est disponible en tas) et envoie l'adresse de la mémoire allouée.
Lorsque la mémoire est allouée par os dans tas, nous pouvons affecter cette valeur d'adresse à toute variable de type pointeur de ce type de données. Ce pointeur est ensuite appelé un pointeur vide jusqu'à ce qu'il ne soit utilisé pour aucun processus.
Lorsque l’espace n’est pas disponible dans le tas, le système d’exploitation alloue certes de la mémoire et envoie une valeur d’adresse correspondant à cet emplacement, mais cette mémoire n’est pas allouée dans le tas par l’OS car il n’ya pas d’espace dans le tas, dans ce cas, cette mémoire est allouée par L'OS dans la mémoire système .. L'utilisateur ne peut pas accéder à cette mémoire. Par conséquent, lorsque nous affectons cette valeur d'adresse dans un pointeur, ce pointeur est appelé pointeur null et nous ne pouvons pas utiliser ce pointeur. Dans le cas du pointeur vide, nous pouvons l'utiliser pour n'importe quel processus dans n'importe quel langage de programmation.
Les pointeurs void
et null
indiquent un emplacement de mémoire à la fin.
Un pointeur null
indique la position (dans un segment de mémoire) qui est généralement la 0ème adresse du segment de mémoire. Il s'agit presque de la façon dont le système d'exploitation sous-jacent traite cet emplacement de mémoire "réservé" (un détail d'implémentation) lorsque vous essayez d'y accéder en lecture/écriture ou déréférencement. Par exemple, cet emplacement de mémoire particulier peut être marqué comme "non accessible" et émet une erreur lors de son accès.
Un pointeur void
peut pointer n'importe où et peut représenter n'importe quel type (primitive, type de référence et y compris null
).
Comme quelqu'un de bien dit ci-dessus, le pointeur null
représente un valeur alors que void*
représente un type plus qu'une valeur.
Un pointeur Null a la valeur 0. Le pointeur void est un pointeur générique introduit par ANSI. Le pointeur générique peut contenir l'adresse de tout type de données.
Je ne pense pas que réponse d'AnT est correct.
NULL
n'est qu'une constante de pointeur, sinon, comment pourrions-nous avoir ptr = NULL
.NULL
est un pointeur, quel est son type. Je pense que le type est juste (void *)
, sinon comment pourrions-nous avoir les deux int * ptr = NULL
et (user-defined type)* ptr = NULL
. void
type est en fait un type universel.Une expression constante entière avec la valeur 0, ou une telle expression convertie dans le type void *, est appelée constante de pointeur null
Donc, simplement: NULL
le pointeur est une constante du pointeur vide.