Duplicate possible:
Qu'est-ce qu'un pointeur vide et qu'est-ce qu'un pointeur nul?
Je vois souvent du code qui ressemble à quelque chose comme ce qui suit:
void * foo(int bar);
Qu'est-ce que ça veut dire? Cela signifie-t-il qu'il peut retourner n'importe quoi? Est-ce similaire à dynamic
ou object
en C #?
Un void*
Ne veut rien dire. C'est un pointeur, mais le type auquel il pointe n'est pas connu.
Ce n'est pas qu'il puisse renvoyer "n'importe quoi". Une fonction qui retourne un void*
Effectue généralement l'une des opérations suivantes:
operator new
Et malloc
retournent: un pointeur sur un bloc de mémoire d'une certaine taille. Comme la mémoire n'a pas de type (car elle ne contient pas encore d'objet correctement construit), elle est sans type. IE: void
.Cette construction est rien comme dynamic
ou object
en C #. Ces outils savent réellement quel est le type d'origine; void*
ne le fait pas. Cela le rend beaucoup plus dangereux que n'importe lequel de ceux-ci, car il est très facile de se tromper et il est impossible de demander si un usage particulier est le bon.
Et sur une note personnelle, si vous voyez du code qui utilise "souvent" void*
, Vous devriez repenser le code que vous regardez. void*
Usage, en particulier en C++, devrait être rare, utilisé principalement pour traiter en mémoire brute.
Void est utilisé comme mot clé. Le pointeur void , également appelé pointeur générique, est un type spécial de pointeur qui peut être pointé sur des objets de tout type de données! Un pointeur vide est déclaré comme un pointeur normal, en utilisant le mot clé void comme type du pointeur:
Syntaxe générale:
void* pointer_variable;
void *pVoid; // pVoid is a void pointer
Un pointeur vide peut pointer sur des objets de tout type de données:
int nValue;
float fValue;
struct Something
{
int nValue;
float fValue;
};
Something sValue;
void *pVoid;
pVoid = &nValue; // valid
pVoid = &fValue; // valid
pVoid = &sValue; // valid
Cependant, comme le pointeur vide ne sait pas quel type d'objet il pointe, il ne peut pas être déréférencé! Au lieu de cela, le pointeur vide doit d'abord être explicitement converti en un autre type de pointeur avant d'être déréférencé.
int nValue = 5;
void *pVoid = &nValue;
// can not dereference pVoid because it is a void pointer
int *pInt = static_cast<int*>(pVoid); // cast from void* to int*
cout << *pInt << endl; // can dereference pInt
Source: lien
UNE void*
Le pointeur est utilisé lorsque vous souhaitez indiquer un pointeur sur un bloc de mémoire sans spécifier le type. malloc
de C renvoie un tel pointeur, dans l'attente que vous le convertissiez immédiatement en un type particulier. Ce n'est vraiment pas utile jusqu'à ce que vous le convertissiez en un autre type de pointeur. Vous êtes censé savoir sur quel type le transtyper, le compilateur ne dispose pas de la capacité de réflexion nécessaire pour connaître le type sous-jacent.
Un vide * peut pointer sur n'importe quoi (c'est un pointeur brut sans aucune information de type).