J'ai souvent du mal à voir les avantages des pointeurs (à l'exception de la programmation de bas niveau).
Pourquoi utiliser de char * au lieu d'une chaîne ou de caractère [] ou quels avantages le pointeur arithmétique apporte.
Alors, quels sont les avantages et les cas d'auteurs?
Les pointeurs sont nécessaires pour l'emplacement de la mémoire dynamique, de nombreuses structures de données et une manipulation efficace de grandes quantités de données. Sans pointeurs, vous devez affecter toutes les données du programme dans le monde ou dans des fonctions ou de l'équivalent, et vous n'auriez pas de recours si la quantité de données a augmenté au-delà de ce que vous aviez autorisé à l'origine. J'hésite à utiliser des absolus ici, mais aussi loin que je connais que toutes les langues informatiques modernes ont des pointeurs sous une forme ou une autre.
Dans la plupart des langues qui utilisent des pointeurs, il existe certaines sortes de références qui sont des pointeurs et peut-être certains types de références qui ne sont pas, et il n'y a pas de différence de notation supplémentaire. Une cellule LISP cons
est une paire de pointeurs, bien qu'un fixnum
ne soit pas un pointeur. En Java, la variable utilisée pour l'instance d'une classe est un pointeur, mais un int
n'est pas. La syntaxe de langue ne reflète pas cela.
C est inhabituel dans lesquels des pointeurs sont facultatifs, explicites et permettent une arithmétique explicite du pointeur. Il est parfaitement possible d'écrire struct foo bar; struct foo * baz;
, Et une fois que vous avez alloué la mémoire pour baz
, vous pouvez utiliser les deux bar
et baz
pour représenter struct foo
s. Étant donné que les pointeurs sont facultatifs, il est utile d'avoir des différences de notation. (Il est essentiel en C++ pour les pointeurs intelligents, comme indiqué boost::shared_ptr<foo> bar;
, bar.reset()
a une signification et bar->reset()
est susceptible d'en avoir beaucoup différent.)
(En fait, des pointeurs explicites étaient souvent utilisés dans d'autres langues lorsque c était initialement développé, tel que ^
À Pascal. C est une langue plus ancienne que la plupart des utilisations communes aujourd'hui, et cela montre.)
L'un des objectifs de conception de C était d'écrire unix dans, et il a donc besoin de gérer des emplacements de mémoire de manière détaillée. (C est en fait l'une des familles de langues de mise en œuvre du système communes lors de sa conception, un autre exemple en train d'être un cybol pour les ordinateurs de données de contrôle. C est celui qui est devenu un gros succès.) Il est donc possible de manipuler des indicateurs C directement, Affectation d'adresses de mémoire et en calculant de nouveaux. Cela a également conduit à certaines décisions de conception dans les tableaux de C. C, repose fortement sur l'arithmétique du pointeur et une matrice se désintègre dans un pointeur dans de très nombreuses situations. Passage des variables aux fonctions C par référence est effectuée par le pointeur. Il n'y avait pas de forte besoin de tableaux et de passer des variables de transmission par référence sous la forme que d'autres langues contemporaines avaient, donc C n'a pas reçu ces.
Donc, la réponse est que, dans la plupart des langues, vous utilisez constamment des pointeurs sans être rappelé le fait. En C, et dans une moindre mesure C++, vous utilisez des pointeurs pour faire des choses à bas niveau, ou comme pour accomplir des choses de niveau supérieur qu'il n'y a pas de notation spéciale pour.
Structures de données complexes. Vous ne pouvez pas construire quelque chose comme une liste liée ou un arbre binaire sans pointeur.
Il n'y a pas de "avantages" et "contre" des pointeurs. Ils ne sont qu'un outil, comme un marteau.
Références en C++, Java et autres types de langues ne sont que des "pointes sûrs". Et ces références sont utilisées beaucoup en Java.
À peu près n'importe quel programme informatique doit inspecter et modifier les valeurs en mémoire (appelée couple et piquer, à ceux d'entre nous qui sont assez vieux). Vous devez contrôler où en mémoire ces valeurs sont, de manière à ce que le résultat soit prévisible (et dans certains cas, la commande est importante: le chargement du code exécutable est un exemple). Par conséquent, vous devez avoir un type de données qui représente un emplacement en mémoire. Même si votre environnement de programmation cache cela sous une abstraction, il est toujours là.
char*
est un exemple défendu de pointeurs. Vous êtes probablement mieux à utiliser std::string
(ou un type de meilleur type qui gère votre spécialité unicode/ANSI/Multibyte) que char*
. Pour presque tout autre exemple de pointeurs (Employee*
, PurchaseOrder*
, ...) Cependant, il y a beaucoup d'avantages:
En fait, les pointeurs sont si importants que la plupart des langues qui semblent ne pas les avoir réellement ne les ont réellement. Types de référence en C # et Java sont essentiellement des pointeurs déguisés en objets solides.
Maintenant, manipulation du pointeur (p++
sur un pointeur, ou p += delta
) est une toute une histoire de noeud. Certaines personnes pensent que c'est dangereux, certaines personnes pensent que c'est génial. Mais c'est encore plus loin de votre question.
Les pointeurs peuvent être plus rapides et peuvent subir moins de frais généraux, à la fois dans des structures de données et en conservant l'empreinte d'exécution du programme. (Veuillez noter le mot 'can'.)
En général, la règle est, si vous avez alloué une ressource, en effectuant votre propre allocation ou en faisant quelque chose en votre nom, alors c'est votre travail de le relâcher lorsque vous avez terminé.
Le fardeau de faire ce qui précède placera la responsabilité du développeur, plutôt que d'avoir le moment de l'exécution. Cela présente des avantages supplémentaires dans ce que les choses peuvent être plus longues vécues, ou des frontières croisées ou être éliminées à des moments plus opportuns, ou n'ont pas besoin de porter le poids d'un collecteur ordures autour.
Dans les cas exotiques, impliquant généralement des exceptions et une portée, il existe des cas de bord qui nécessitent un peu plus prudent si le code est évité le nettoyage. De manière réaliste, ces cas peuvent être conçus autour. Nous avons vécu sans code géré pendant plusieurs décennies.
Souvent ce qui fait que les pointeurs "durs" ne comprennent simplement pas ce qui se passe au niveau du matériel. Ce n'est rien de plus que l'indirection.
Les pointeurs vous donnent beaucoup plus d'accès brut, ce qui peut être très utile, intelligent ou nécessaire. Vous pouvez indiquer n'importe où et le traiter à peu près quelque chose. Si vous utilisez vos pouvoirs semblables à Dieu pour de bon, c'est très, très bon.
Le côté du visage est généralement des déchets en oubliant de libérer quelque chose ou en le relâchant plus d'une fois, ou en faisant référence à quelque chose après sa libération, ou en réfongeant quelque chose lorsque vous ne pointerez nulle part. Ces choses entraînent souvent des accidents spectaculaires et d'être honnêtes sont généralement indicatifs que vous avez un problème logique, plutôt que des pointeurs sont fragiles.
Si vous êtes un développeur solide, utiliser des pointeurs ne devraient plus être plus problématiques que toute autre structure de données. Encore une fois, ce n'est pas la science de la fusée et les gens l'ont fait depuis des décennies sans même clignoter un œil. C'est juste enseigné moins longtemps ces jours-ci.
Tout ce qui a dit, à moins que vous n'ayez besoin de pointeurs, de la conduite et des cas exoïtiques qu'une bonne collection de déchets fournit de travailler dans un environnement géré plus agréable. C'est un plaisir de pouvoir attraper une certaine mémoire, l'utiliser et l'abandonner, sachant que, à un moment donné, cela pourrait être discarder, si cela a du sens de le faire. C'est un peu moins de code sur la partie du codeur, en échange d'un remontage supplémentaire.
La meilleure réponse est en fait incluse dans la question: les pointeurs sont destinés à une programmation de bas niveau. Certes, si vous utilisez C, n'utilisez pas les pointeurs, c'est comme une programmation avec une seule main attachée derrière votre dos, mais la réponse à celle-ci est d'utiliser une langue de niveau supérieur à la place.