Qu'est ce qu'un pointeur void et qu'est ce qu'un pointeur null?

donc j'ai passé en revue quelques questions d'entrevue et je suis tombé sur un à propos de nulles et nulles pointeurs , qui affirme:

un pointeur sans type de retour est appelé un pointeur null. Il peut être n'importe quel type de type de données.

cela m'a complètement embrouillé! Elle semble nulle et non avenue pourrait être utilisée de façon interchangeable selon cette question, et je ne crois pas que ce soit correct. J'ai supposé nul pour être un type de retour et null pour être une valeur. Mais je ne suis qu'un débutant et je ne suis pas sûr d'avoir raison.

nous vous demandons d'exprimer votre point de vue quant à ce qu'est un pointeur null est et un vide pointeur. Je ne cherche pas la différence entre nul et nul.

33
demandé sur Lightness Races in Orbit 2010-12-02 15:12:07

9 réponses

les deux concepts sont orthogonaux:

  1. un pointeur de vide, ( void * ) est un pointeur brut vers un emplacement de mémoire.
  2. un pointeur nul est un pointeur spécial qui ne pointe vers rien, par définition. Il peut être un indicateur de n'importe quel type, vide ou autre.

un indicateur de vide peut être nul ou non:

void *void_ptr1 = nullptr;
void *void_ptr2 = malloc(42);
void *void_ptr3 = new Foo;               // void * can point to almost anything
void *void_ptr4 = (char*)void_ptr3 + 1;  // even somewhere inside an object

un pointeur non nul peut aussi être nul ou non:

Foo *f = nullptr;
Foo *g = new Foo;
38
répondu Marcelo Cantos 2018-06-23 03:02:31

oubliez simplement cette réponse. Une citation de votre lien :

"un pointeur sans type de retour est appelé un pointeur null."

C'est vraiment très claire MAUVAIS . Un pointeur type de retour ? VRAIMENT? C'est une mauvaise source...

void* est pointeur universel type parce que n'importe quel type de pointeur (sauf pointeur à const et/ou volatile) peut être implicitement converti en void* . En d'autres termes, vous pouvez assigner n'importe quel pointeur à une variable de type void* . Un pointeur nul est un pointeur valeur 0

27
répondu Armen Tsirunyan 2010-12-02 12:15:54

le type void en général signifie qu'aucune information sur le type n'est fournie.

vous devez toujours garder à l'esprit qu'un pointeur transmet deux éléments d'information: le type des données pointées( int , double , ...), qui spécifie comment l'interpréter, et le adresse des données qu'il pointe, qui spécifie vous pouvez obtenir la valeur réelle de la pointe données.

l'information de type est dans le type du pointeur ( double * , int * , ...), alors que l'adresse des données est la valeur réelle contenue dans la variable de pointeur.

ainsi, un pointeur void ( void * ) est un pointeur qui ne spécifie aucune information de type. Il vous indique où les données sont, mais il ne vous dit pas comment l'interpréter. Vous sachez qu'à cette adresse il y a quelque chose, mais vous ne savez pas si c'est un int , un double ou une rangée de vaches volantes. Pour réellement utiliser de telles données, vous devez obtenir des informations de type à ce sujet d'une autre manière (par exemple avec un autre paramètre magique), jeter ce pointeur sur un type de pointeur régulier et ensuite l'utiliser comme d'habitude.

void * est souvent utilisé en C pour fournir une certaine forme de soutien à la programmation générique; voir par exemple le qsort c bibliothèque fonction.

Un NULL pointeur est un pointeur qui pointe vers rien. Dans ce cas, l'information de type sur le pointeur en général est présente, mais c'est l'adresse des données pointées qui est manquante. Bien sûr, il est possible d'avoir un void * qui est NULL .

exemple rapide (supposons que v soit déclaré comme double v; ):

                         Type information present
             +----------------------+----------------------+
             |          ✔           |          ✘           |
         +---+----------------------+----------------------+
    p  c |   |                      |                      |
 v  o  o | ✔ | double * ptr = &v;   | void * ptr = &v;     |
 a  i  n |   |                      |                      |
 l  n  t +---+----------------------+----------------------+
 i  t  e |   |                      |                      |
 d  e  n | ✘ | double * ptr = NULL; | void * ptr = NULL;   |
    d  t |   |                      |                      |
         +---+----------------------+----------------------+

anecdotes : NULL , au moins dans la norme actuelle, est garanti d'être 0.

dans d'autres zones de la langue, void est toujours utilisé pour spécifier le manque de type. L'utiliser comme valeur de retour (note: je parle maintenant de void , pas de void * ) signifie que la fonction ne renvoie aucune valeur, et lancer une expression à nul est une façon fantaisiste de rejeter une valeur (vous signalez au compilateur et au autres programmeurs que vous êtes conscient que vous n'utilisez pas une certaine valeur).

12
répondu Matteo Italia 2010-12-02 12:43:03

s'il vous plaît, dites-nous: quelle est la différence:

  • entre le réservoir d'essence et pas de gaz de la situation
  • entre cookie jar et sans cookies
  • entre le terme "argent" et "poches vides

si vous arrivez avec ceux-ci, vous serez en mesure de saisir null vs null* dillema.

9
répondu Daniel Mošmondor 2010-12-02 12:19:56

void est un non-type. null est une non-valeur.

8
répondu Nicolas Repiquet 2010-12-02 12:17:55

Voici quelques différences par rapport à l'arithmétique des pointeurs:

il découle du fait que le vide est un type incomplet.

void *vp;
vp++;     // error, incomplete type
vp += 2;  // same error

void *p = 0;
p++;      // still same error

int *p = 0;
p++;      // well-formed program, but UB (.6/5)
2
répondu Chubsdad 2010-12-02 12:25:50

L'article lié est tout simplement faux. Sa première phrase:

un pointeur sans type de retour est appelé un pointeur nul

déclenche toutes sortes d'alarmes pour moi. C'est un très confus morceau de l'écriture.

vous avez presque raison. "Pointeur sur void" est un type (pas un "type de retour"). Les valeurs de n'importe quel type peuvent être retournées par des fonctions, et ainsi être (la fonction de) type de retour.

un pointeur nul est un pointeur qui, quel que soit son type, pointe vers l'objet nul, qui n'est pas un objet valide qui peut être créé. Un pointeur nul peut être dit pour pointer vers "rien".

un pointeur vers nul peut aussi être nul;

void *nothing = 0;

est un code parfaitement valide, et il dit simplement que ce pointeur est capable de pointer un objet non typé, mais pour l'instant il ne l'est pas.

1
répondu unwind 2010-12-02 12:17:49

le pointeur nul est le point 0x000000(ce qui est incorrect pour le pointeur d'accès), tandis que le pointeur nul est un pointeur correct vers un type non spécifié( void * ). Cependant, void pointer peut être null pointeur, mais alors unreferencing le pointeur générera l'erreur.

1
répondu Vladimir Ivanov 2010-12-02 13:27:11

Un void *ptr est le pointeur qui peut être utilisé pour pointer n'importe quel type de données. Il peut-être int , float , double . Il n'a pas de type retour qui est initialement pointeur est créé avec le type pointeur (ayant une valeur hex) et nous pouvons assigner ce pointeur à n'importe quel type de données.

alors que null pointer est le pointeur ayant une valeur nulle comme adresse, le pointeur se voit attribuer une valeur nulle de sorte qu'il ne peut pas être utilisé pour accéder à d'autres données dont son adresse peut contenir lors de la création. Je pense que c'est une bonne technique de programmation pour assigner un pointeur NULL si elle n'est pas utilisée pour le moment.

1
répondu anurag tiwari 2016-09-24 17:04:27