Question

Je lis du code dans la mise en œuvre de Ogre3D et je ne comprends pas ce qu'est un void * type variable signifie. Que signifie un pointeur sur void en C ++?

Était-ce utile?

La solution

Un pointeur sur void, void * peut pointer sur n'importe quel objet:

int a = 5;
void *p = &a;

double b = 3.14;
p = &b;

Vous ne pouvez pas déréférencer, incrémenter ou décrémenter ce pointeur, car vous ne savez pas quel type vous pointez. L'idée est que void * peut être utilisé pour des fonctions telles que memcpy qui copient simplement des blocs de mémoire, sans se soucier du type qu'ils copient.

Autres conseils

C'est juste un pointeur générique, utilisé pour transmettre des données lorsque vous ne connaissez pas le type. Vous devez utiliser le bon type pour pouvoir l'utiliser.

Il s’agit d’un pointeur brut vers un point en mémoire. Il ne permet aucune arithmétique de pointeur comme char * ou int *.

Voici quelques exemples d'utilisation

http://theory.uwinnipeg.ca/programming/node87.html

Il s'agit d'un pointeur sur tout - juste une partie de la mémoire avec laquelle vous pouvez jouer - peut être un objet, peut-être un caractère. Vous devez faire un casting pour faire quelque chose d’utile avec.

Création d'une publication antérieure ...

ATTENTION: Toutes les adresses mémoire sont fictives. Je ne fais que les inventer pour illustrer un point.

Donné:

int data[] = {10,11,12};

Nous avons maintenant:

0xffff0000-0xffff0003  with a value of (int)(10)
0xffff0004-0xffff0007  with a value of (int)(11)
0xffff0008-0xffff000b  with a value of (int)(12)

(Je ne vais pas entrer ici dans la commande d'octets big-endian vs little-endian.)

Si nous avons:

int * p = data;

Nous avons maintenant un autre emplacement de mémoire ailleurs, par exemple:

 0xaaaa0000-0xaaaa0003  with a value of (int*)0xffff0000

Nous pouvons utiliser p [1] [ou * (p + 1)] pour faire référence à * (int *) (0xffff0004) [= 11] sous la forme sizeof (int) = 4 et 0xffff0000 + sizeof (int) = 0xffff0004.

Si nous avons:

void * v = data;

Nous avons maintenant un autre emplacement de mémoire ailleurs, par exemple:

 0xbbbb0000-0xbbbb0003  with a value of (void*)0xffff0000.

Cependant, void n’a aucune information sizeof () associée. Nous ne pouvons pas incrémenter ou décrémenter le pointeur. Nous ne pouvons pas déréférencer pour accéder aux données stockées dans 0xffff0000. Nous ne pouvons utiliser cette valeur qu’en tant qu’adresse de mémoire brute.

Si nous voulons utiliser les données stockées dans (void *) 0xffff0000, nous devons d’abord les convertir en un type approprié.

Cela dit, (void *) est encore très utile pour passer des adresses à des structures de données arbitraires. Par exemple, memset (). Peu importe que je mette à zéro un struct tm ou un struct sockaddr . Nous avons juste besoin d’un pointeur sur la structure et sa taille.

(Cela devrait aller de soi, mais ... Attention, utilisez memset pour mettre à zéro une instance de classe et, ce faisant, écraser la table de pointeurs virtuels.)

Un pointeur vide ne peut pas pointer sur un membre de la classe en C ++.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top