Votre question est probablement mieux répondu par une explication de ce que signifie void
.
void
indique fondamentalement l'absence d'un type. En conséquence, vous ne pouvez pas demander au compilateur de créer un objet de type void
, par ex. avec les énoncés suivants:
La signification de ces expressions est à peu près ce qui suit: "créer quelque chose", ou "créer un tableau de somethings" respectivement. Ce n'est clairement pas une déclaration assez précise pour le compilateur.
void*
(pointeur vers void
) est cependant autorisé car les pointeurs sont fondamentalement toujours la même chose pour le compilateur: une adresse mémoire d'un autre objet.Vous pouvez penser à un pointeur comme une sorte de flèche pointant vers quelque chose. Si vous travaillez avec un pointeur, le compilateur voit cette flèche, et non la chose sur laquelle elle pointe. Par conséquent le compilateur ne se soucie pas que le "type de cible" est void
.
La conséquence de cela, cependant, est que vous ne pouvez pas déréférencer un void*
(pointeur vers void
), car alors vous faites le compilateur regarder efficacement à l'pointé à la chose, ce qui serait une valeur void
, qui ne avoir un sens pour le compilateur.
Résumé:
1) Vous ne pouvez pas créer un tableau de type void
, comme dans new void[...]
.
2) Vous pouvez créer un pointeur vers void
(void*
), ou même un pointeur vers un pointeur vers void*
(void**
).
3) Vous ne peut déréférencer un pointeur void*
(mais vous pouvez déréférencer un pointeur void**
).
Conclusions:
4) Vous pouvez créer un tableau int*
et laisser un void*
s'y réfèrent:
int** m;
// ... (create the dangling array as in the OP's code and let m point to it)
void* v = (void*)m;
(Voir les commentaires ci-dessous pourquoi un void*
est utilisé ici au lieu de void**
!)
5) En raison de la déclaration n ° 3, tout ce que vous pouvez raisonnablement faire avec un tel pointeur est de le passer, mais vous ne pouvez pas travailler sur le contenu réel de la baie. Pour ce faire, vous devez taper moulé revenir au type de données correct:
int **m2 = (int**)v;
Pourquoi voulez-vous faire? Qu'est-ce que vous essayez d'accomplir? Aussi, cela peut être urgent pour vous, mais ce n'est pas pour nous, alors calmez-vous et énoncez votre problème plus clairement afin que nous puissions mieux vous aider. –
J'ai enlevé le "Urgent! Please!" depuis le début de votre titre. Ce n'est pas approprié ici sur SO. –
Je pense que vous avez un "*" supplémentaire dans "et si le type de pointeur est ..." – Manuel