web-dev-qa-db-fra.com

Qu'est-ce qu'un pointeur vide en C ++?

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 #?

76
zeboidlund

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:

  • Il s’agit d’une mémoire non formatée. C'est ce que 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.
  • C'est un manche opaque; il référence un objet créé sans nommer un type spécifique. Le code qui fait cela est généralement mal formé, car cela est mieux fait en déclarant en avant une structure/classe et en ne fournissant simplement pas une définition publique pour elle. Parce qu'alors, au moins il a un type réel.
  • Il renvoie un pointeur sur la mémoire qui contient un objet d'un type connu. Cependant, cette API est utilisée pour traiter des objets d'une grande variété de types. Par conséquent, le type exact renvoyé par un appel particulier ne peut pas être connu au moment de la compilation. Par conséquent, il y aura une documentation expliquant quand il stockera quels types d'objets, et donc quel type vous pouvez le transtyper en toute sécurité.

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.

92
Nicol Bolas

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

28
User1988

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.

23
Mark Ransom

Un vide * peut pointer sur n'importe quoi (c'est un pointeur brut sans aucune information de type).

4
axon