33 votes

Ce que les vrais utiliser un double pointeur avoir?

J'ai cherché et cherché une réponse à cela, mais ne peut pas trouver ce que je fait "prendre".

Je suis très très novice en c++ et ne peut pas obtenir ma tête autour de l'utilisation de la double, triple pointeurs etc.. Ce qui est le point d'entre eux?

Quelqu'un peut-il m'éclairer

52voto

Honnêtement, écrits en C++, vous devez très rarement voir un T** à l'extérieur de la bibliothèque de code. En fait, les étoiles plus vous avez, plus vous êtes proche de remporter un prix d'une certaine nature.

Cela ne veut pas dire qu'un pointeur de pointeur n'est jamais appelé pour; vous pouvez être amené à créer un pointeur vers un pointeur pour la même raison que vous avez besoin de construire un pointeur vers n'importe quel autre type d'objet.

En particulier, je pourrait s'attendre à voir une telle chose à l'intérieur d'une structure de données ou l'implémentation de l'algorithme, lorsque vous êtes traînant autour allouée dynamiquement les nœuds, peut-être?

En règle générale, cependant, en dehors de ce contexte, si vous avez besoin de passer une référence à un pointeur, vous auriez du le faire (c'est à dire T*&) plutôt que de doubler sur les pointeurs, et de même que doivent être assez rares.

Sur un Débordement de Pile, vous allez voir des gens faire des choses horrible avec des pointeurs vers des tableaux de pointeurs alloués dynamiquement aux données, en essayant de mettre en œuvre la moins efficace "vectoriel 2D" ils peuvent penser. Merci de ne pas être inspiré par eux.

En résumé, votre intuition n'est pas sans mérite.

16voto

Edwin Points 2152

Une des raisons importantes pour lesquelles vous devriez/devez savoir à propos de pointeur de pointeur... est-ce que vous avez parfois à l'interface avec d'autres langages (comme C par exemple) par le biais de certaines API (par exemple l'API Windows).

Ces Api ont souvent des fonctions qui ont une sortie paramètre qui renvoie un pointeur. Cependant, les autres langues n'ont souvent pas de références ou compatible (avec C++) références. C'est une situation où pointeur de pointeur est nécessaire.

13voto

user3600107 Points 156

C'est de moins en moins utilisées en c++. Toutefois, en C, il peut être très utile. Dire que vous avez une fonction malloc certains montant aléatoire de la mémoire et de remplir la mémoire avec quelques trucs. Ce serait une douleur d'avoir à appeler une fonction pour obtenir la taille dont vous avez besoin pour allouer et ensuite appeler une autre fonction qui va remplir la mémoire. Au lieu de cela, vous pouvez utiliser un double pointeur. Le double pointeur permet à la fonction de définir le pointeur à l'emplacement de la mémoire. Il y a quelques autres choses, il peut être utilisé pour, mais c'est la meilleure chose que je peux penser.

int func(char** mem){
    *mem = malloc(50);
    return 50;
}

int main(){
    char* mem = NULL;
    int size = func(&mem);
    free(mem);
}

12voto

Eric Lippert Points 300275

Je suis très très novice en c++ et ne peut pas obtenir ma tête autour de l'utilisation de la double, triple pointeurs etc.. Ce qui est le point d'entre eux?

Le truc à comprendre les pointeurs en C est tout simplement de revenir à l'essentiel, qui vous ont probablement jamais été enseigné. Ils sont les suivants:

  • Des Variables pour stocker des valeurs d'un type particulier.
  • Les pointeurs sont une sorte de valeur.
  • Si x est une variable de type T alors &x est une valeur de type T*.
  • Si x correspond à une valeur de type T* alors *x est une variable de type T. Plus spécifiquement...
  • ... si x correspond à une valeur de type T* qui est égal à &a pour certaines variables a de type T, alors *x est un alias pour a.

Maintenant, tout ce qui suit:

int x = 123;

x est une variable de type int. Sa valeur est 123.

int* y = &x;

y est une variable de type int*. x est une variable de type int. Donc, &x est une valeur de type int*. Par conséquent, nous pouvons stocker &x en y.

*y = 456;

y représente le contenu de la variable y. C'est une valeur de type int*. En appliquant * pour une valeur de type int* donne une variable de type int. Par conséquent, nous pouvons attribuer 456 à elle. Qu'est - *y? C'est un alias pour x. Donc nous avons juste attribué 456 à x.

int** z = &y;

Qu'est - z? C'est une variable de type int**. Qu'est - &y? Depuis y est une variable de type int*, &y doit être une valeur de type int**. Par conséquent, nous pouvons l'attribuer z.

**z = 789;

Qu'est - **z? Le travail de l'intérieur. z donne un int**. Par conséquent, *z est une variable de type int*. C'est un alias pour y. Donc c'est le même que *y, et nous savons déjà ce que c'est; c'est un alias pour x.

Non, vraiment, quel est le point?

Ici, j'ai un morceau de papier. Il dit 1600 Pennsylvania Avenue Washington DC. C'est qu'une maison? Non, c'est un morceau de papier avec l'adresse d'une maison écrit sur elle. Mais nous pouvons utiliser ce morceau de papier pour trouver la maison.

Ici, j'ai dix millions de morceaux de papier, tous numérotés. Papier numéro 123456, dit - 1600 Pennsylvania Avenue. Est 123456 une maison? Pas de. Est-ce un morceau de papier? Pas de. Mais il est encore assez d'informations pour moi de trouver la maison.

C'est le point: souvent, nous devons nous référer à des entités à travers plusieurs niveaux d'indirection pour des raisons de commodité.

Cela dit, les doubles pointeurs sont source de confusion et un signe que votre algorithme est pas suffisamment abstraite. Essayez de les éviter en utilisant des techniques de conception.

10voto

Kingsley Points 4886

Un double pointeur, est simplement un pointeur vers un pointeur. Une utilisation courante est pour les tableaux de chaînes de caractères. Imaginez la première fonction dans juste au sujet de chaque programme C/C++:

int main(int argc, char *argv[])
{
   ...
}

Qui peut aussi être écrit

int main(int argc, char **argv)
{
   ...
}

La variable argv est un pointeur vers un tableau de pointeurs sur char. C'est un moyen standard de passage autour des tableaux de C "chaînes". Pourquoi le faire? Je l'ai vu utilisé pour le support multi-langue, des blocs de chaînes d'erreur, etc.

N'oubliez pas qu'un pointeur est un nombre - l'index de la mémoire "logement" à l'intérieur d'un ordinateur. C'est tout, rien de plus. Donc un double pointeur est l'indice d'un élément de la mémoire qui se trouve tout juste à tenir un autre indice à un autre endroit. Mathématique rejoindre les points si vous le souhaitez.

C'est la façon dont je l'ai expliqué pointeurs à mes enfants:

Imaginez la mémoire de l'ordinateur est une série de boîtes. Chaque boîte a un numéro écrit sur elle, en commençant à zéro, en remontant par 1, cependant le nombre d'octets de la mémoire, il est. Disons que vous avez un pointeur vers un lieu de mémoire. Ce pointeur est juste le numéro de la boîte. Mon pointeur est, disons 4. Je regarde dans la case no 4. L'intérieur est un autre numéro, cette fois c'est 6. Alors maintenant, nous regardons dans l'encadré 6, et obtenez la dernière chose que nous voulions. Mon premier pointeur (qui a dit "4") était un double pointeur, parce que le contenu de sa boîte était l'indice d'une autre boîte, plutôt que d'être un résultat final.

Il semble que ces derniers temps, les pointeurs eux-mêmes sont devenus des parias de la programmation. De retour dans le pas trop lointain passé, il était tout à fait normal de passer des pointeurs de pointeurs. Mais avec la prolifération de Java, et de l'utilisation croissante par référence en C++, la compréhension fondamentale des pointeurs en déclin, en particulier autour de lors de Java s'est établie comme une première année en informatique, les débutants de la langue, sur Pascal et C.

Je pense que beaucoup de venin sur les pointeurs est parce que les gens ne sont pas toujours les comprendre correctement. Choses que les gens ne comprennent pas obtenir un objet de dérision. Alors ils sont devenus "trop dur" et "trop dangereux". Je suppose que même avec de soi-disant savants préconisent des Pointeurs Intelligents, etc. ces idées sont à prévoir. Mais en réalité, il y a un très puissant outil de programmation. Honnêtement, les pointeurs sont la magie de la programmation, et après-tout, ils sont juste un nombre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X