Quelle est la différence entre un pointeur nul et un pointeur vide?

Quelle est la différence entre un pointeur nul et un pointeur vide ?

Le pointeur nul est une valeur réservée spéciale d’un pointeur. Un pointeur de n’importe quel type a une telle valeur réservée. Formellement, chaque type de pointeur spécifique ( int * , char * etc.) a sa propre valeur de pointeur null dédiée. Conceptuellement, lorsqu’un pointeur a cette valeur nulle, il ne pointe pas du tout.

Pointeur vide est un type de pointeur spécifique – void * – un pointeur qui pointe vers un emplacement de données dans le stockage, qui ne possède aucun type spécifique.

Donc, encore une fois, le pointeur null est une valeur , tandis que le 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 exactement valide. C’est comme demander, par exemple, “Quelle est la différence entre un sortingangle et une voiture?”.

Ce sont deux concepts différents: “pointeur vide” est un type (vide *). “pointeur nul” est un pointeur dont la valeur est zéro (NULL). Exemple:

 void *pointer = NULL; 

C’est un pointeur vide NULL.

Un pointeur nul est garanti pour ne pas être égal à un pointeur sur un object. Sa valeur réelle dépend du système et peut varier en fonction du type. Pour obtenir un pointeur int nul vous feriez

 int* p = 0; 

Un pointeur nul sera renvoyé par malloc en cas d’échec.

Nous pouvons tester si un pointeur est nul, 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 sur n’importe quel type et il vous appartient de gérer la quantité de mémoire consommée par les objects référencés pour le déréférencement et l’arithmétique des pointeurs.

Vide fait référence au type. Fondamentalement, le type de données sur lequel il pointe est inconnu.

Null désigne la valeur. C’est essentiellement un pointeur sur rien et est invalide à utiliser.

Un pointeur nul pointe sur la valeur NULL qui est généralement égale à 0, mais en tout état de cause, un emplacement de mémoire non valide pour la référence. Un pointeur vide pointe les données de type vide. Le mot “vide” n’indique pas que les données référencées par le pointeur sont invalides ou que le pointeur a été annulé.

Un pointeur nul (qui peut être de n’importe quel type, y compris un pointeur vide!) Pointe généralement vers:

  • l’adresse 0, par rapport à laquelle la plupart des ensembles d’instructions CPU peuvent effectuer des comparaisons très rapides (pour vérifier des pointeurs non initialisés ou non valides, par exemple) avec une taille / performance de code optimale pour l’ISA.

  • une adresse illégale pour l’access au code utilisateur (tel que 0x00000000 dans de nombreux cas), de sorte que si un code tente d’accéder aux données à cette adresse, le système d’exploitation ou le débogueur peut facilement arrêter ou piéger un programme avec ce bogue.

Un pointeur vide est généralement une méthode de sortingche ou de désactivation de la vérification du type de compilateur, par exemple si vous souhaitez renvoyer un pointeur sur un type ou un type inconnu à utiliser comme un autre type. Par exemple, malloc () renvoie un pointeur vide à un bloc de mémoire sans type, que vous pouvez convertir ultérieurement en pointeur, en octets, en caractères courts, en doubles flottants, en caractères typePotato, etc.

NULL est une valeur valide 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 et 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 le pointeur vide fait référence avant de pouvoir accéder à la valeur.

Les pointeurs nuls et les pointeurs de vide sont complètement différents les uns des autres. Si nous demandons au système d’exploitation (via malloc () en langage C) d’allouer de la mémoire pour un type de données particulier, le système d’exploitation 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 en tas, nous pouvons atsortingbuer cette valeur d’adresse dans toute variable de type pointeur de ce type de données. Ce pointeur est alors appelé pointeur vide jusqu’à ce qu’il ne soit pas pris pour un processus.

Lorsque l’espace n’est pas disponible en tas, le système d’exploitation alloue certainement de la mémoire et envoie une valeur d’adresse de cet emplacement, mais cette mémoire n’est pas allouée en tas car il n’y a pas d’espace dans le tas. le os dans la mémoire système .. Cette mémoire ne peut pas être accédée par l’utilisateur donc quand on atsortingbue cette valeur d’adresse dans un pointeur alors ce pointeur est connu comme pointeur nul, et nous ne pouvons pas utiliser ce pointeur. Dans le cas d’un pointeur vide, nous pouvons l’utiliser pour n’importe quel processus dans n’importe quel langage de programmation.

Je ne pense pas que la réponse d’AnT soit correcte.

  1. NULL est juste un pointeur constant, sinon comment pourrions-nous avoir ptr = NULL .
  2. Comme NULL est un pointeur, quel est son type. Je pense que le type est juste (void *) , sinon comment pourrions-nous avoir à la fois int * ptr = NULL et (user-defined type)* ptr = NULL . void type void est en réalité un type universel.
  3. Cité dans “C11 (ISO / IEC 9899: 201x) §6.3.2.3 Pointeurs Section 3”:

    Une expression de type entier avec la valeur 0, ou une expression de ce type exprimée pour taper void *, est appelée constante de pointeur nul

Donc, mettez simplement: Le pointeur NULL est une constante de pointeur vide.

Le pointeur NULL est un pointeur qui ne pointe sur rien, il est utilisé dans les cas où un pointeur n’est pas associé à une adresse valide dans la mémoire. Chaque type de pointeur, c.-à-d. Int *, char *, a chacun une valeur de pointeur nulle propre.

Un pointeur vide est un pointeur auquel aucun type de données n’est associé, c’est-à-dire qu’il peut être assigné à une valeur quelconque. Aussi connu sous le nom de pointeur d’usage général, il s’agit d’une convention C pour une adresse brute.

Ainsi, un pointeur nul est fondamentalement une valeur nulle atsortingbuée à un pointeur de n’importe quel type de données, tandis qu’un pointeur vide est un type de données qui rest vide tant qu’une adresse d’un type de données ne lui est pas atsortingbuée.