2010-05-27 5 views
1

Un corps peut-il expliquer les différentes catégories de pointeur (comme les pointeurs sauvages)?quelle est la Différentes catégories de pointeurs?

+1

pouvez-vous préciser? quelles catégories? pointeur sauvage n'est pas un terme standard. – Naveen

+0

Le pointeur sauvage est un terme standard de facto, ce qui signifie une variable de pointeur non initialisée pointant vers un emplacement aléatoire. Pour d'autres termes similaires, demandez à Google. –

+3

Jamais entendu parler d'un pointeur sauvage, et je fais cela depuis un moment. –

Répondre

9
  • Valid pointeur: un pointant vers un objet réel en mémoire
  • pointeur non valide: un pointant vers la mémoire qui est pas ce qu'il est censé être. Pointeur: Un pointeur dont la valeur est 0 et ne pointe donc à rien.
  • NULL
  • Dangling pointeur (parfois aussi pointeur sauvage): un pointant vers la mémoire qui a été effacée/libérée. Pointeur: Pas vraiment un pointeur du tout, mais plutôt un objet qui agit comme un pointeur, mais qui gère la mémoire pour vous.
+0

AFAIK La valeur du pointeur NULL n'a pas besoin d'être zéro (le modèle binaire peut varier d'une machine à l'autre), bien que la constante NULL soit nulle. –

+0

Je pourrais classer "Dangling" et "Invalide" comme la même chose. Null aussi, vraiment, mais c'est invalide de manière vérifiable. –

+2

Mais logiquement, ils sont différents. Un pointeur n'est pas valide si vous avez épuisé les limites ou si vous l'avez incorrectement attribué à la mauvaise adresse. Si vous l'avez oublié, il a déjà été libéré. ​​ –

5

... ajouter orthogonalement à la réponse de Steve -

  • pointeur à une variable (int*, char*, également void* qui est un pseudo-type spécial qui doit toujours être jeté avant déréférencement aussi. pointeurs de pointeurs.)
  • de pointeur
  • à une fonction (void(*)(), int(*)(int)) et ainsi de suite.)

La distinction est importante parce qu'une famille ne peut pas être moulée dans l'autre, et vice versa.

6

Il existe également des pointeurs de fonction qui pointent vers un code plutôt que vers des objets. Et des pointeurs vers des membres, qui nécessitent une instance de classe pour être entièrement déréférencés. Et des pointeurs vers les fonctions membres, qui pointent vers le code et requièrent une instance d'une classe pour la déréférencer complètement.

Il existe également différents types de pointeurs intelligents. Ils sont utilisés pour conclure des allocations de mémoire dynamique et suivre la propriété des données sous-jacentes. Lorsque plus personne ne possède les données, la mémoire dynamique est automatiquement libérée. Les trois biggies ici sont des pointeurs de portée, des pointeurs partagés et des pointeurs faibles. Les pointeurs Scoped ont seulement un propriétaire, et quand ils sortent de la portée, ils sont supprimés [voir std::auto_ptr en C++ 03 et std::unique_ptr en C++ 0x]. Les pointeurs partagés peuvent avoir plusieurs propriétaires, et la mémoire n'est pas libérée tant que tous les propriétaires n'en ont pas fini avec eux. Les pointeurs faibles sont une forme de ceux-ci, mais ils ne maintiennent pas la propriété stricte à tout moment; ils demandent la propriété quand ils en ont besoin, et cette demande est refusée si le pointeur partagé correspondant n'a plus de propriétaires.

+1

+1 pour les pointeurs vers les membres;) –

+0

Les pointeurs vers les membres nécessitent une * instance *, pas une classe à déréférencer. –

+0

Désolé, oui, vous avez raison. –

2

Vous pouvez également ajouter un autre niveau de pointeurs de catégorisation et trier en fonction de leur « constness »:

pointeur sur un const - Vous pouvez changer de pointeur, mais pas ce qu'il pointe.

Exemple:

int i = 42; 
const int* pi = &i; 

ou

int i = 42; 
int const* pi = &i; 

pointeur Const - Vous ne pouvez pas changer ce que les points de pointeur pour.

Exemple:

int i = 42; 
int* const pi = &i; 

pointeur Const à un const - Vous ne pouvez pas changer ce que les points de pointeur et vous ne pouvez pas changer le pointeur lui-même.

Exemple:

int i = 42; 
const int* const pi = &i; 
Questions connexes