29 votes

Quelle est la vraie différence entre les pointeurs et les références?

AKA - Quelle est cette obsession des pointeurs?

N'ayant vraiment utilisé que des langages modernes orientés objet comme ActionScript, Java et C #, je ne comprends pas vraiment l'importance des pointeurs et à quoi ils servent. Qu'est-ce que je manque ici?

79voto

Adam Wright Points 31715

C'est tout simplement l'indirection: La capacité à ne pas traiter les données, mais de dire "je vais vous orienter vers certains de données, plus de là". Vous avez le même concept en Java et en C#, mais seulement dans le format de référence.

Les principales différences sont que les références sont effectivement immuable panneaux - ils toujours pointer vers quelque chose. C'est utile, et facile à comprendre, mais moins flexible que le C pointeur de modèle. C les pointeurs sont des signes que vous pouvez facilement réécrire. Vous savez que la chaîne que vous recherchez est à côté de la chaîne pointée? Ainsi, il suffit de modifier légèrement le panneau.

Couples bien avec C est "proche de l'os, le faible niveau de connaissances requis" approche. Nous savons qu'un char* toto se compose d'un ensemble de caractères commençant à l'emplacement indiqué par les foo panneau. Si nous savons également que la chaîne est à moins de 10 caractères, nous pouvons changer le panneau d' (foo + 5) à point, puis à la même chaîne, mais à partir de la moitié de la longueur.

Cette flexibilité est utile lorsque vous savez ce que vous faites, et la mort si vous n'avez pas (où le "savoir" est plus que juste "la connaissance de la langue", c'est "connaître l'état exact du programme"). Se tromper, et ton panneau est de vous diriger sur le bord d'une falaise. Les références ne pas vous laisser tripoter, afin que vous soyez beaucoup plus confiant que vous pouvez les suivre sans risque (en particulier lorsqu'il est couplé avec des règles comme "Un objet référencé ne disparaîtra jamais", comme dans la plupart de ces Ordures langues).

28voto

Antti Rasinen Points 2837

Vous êtes absent dehors sur une beaucoup! Comprendre comment l'ordinateur fonctionne sur les niveaux inférieurs est très utile dans plusieurs situations. C et l'assembleur va le faire pour vous.

Fondamentalement, un pointeur vous permet d'écrire des trucs à n'importe quel point dans la mémoire de l'ordinateur. Sur les plus primitives de matériel/OS ou dans les systèmes embarqués en fait, cela pourrait faire quelque chose d'utile. Dire tourner le blinkenlichts sur et en dehors à nouveau.

Bien sûr, cela ne fonctionne pas sur les systèmes modernes. Le système d'exploitation est le Seigneur et Maître de la mémoire principale. Si vous essayez d'accéder à un emplacement mémoire incorrect, votre processus de payer pour son arrogance avec sa vie.

En C, les pointeurs sont la façon de passer les références aux données. Lorsque vous appelez une fonction, vous ne voulez pas copier un million de bits à une pile. Au lieu de cela il vous suffit d'indiquer où se trouvent les données dans la mémoire principale. En d'autres termes, vous donner un pointeur vers les données.

Dans une certaine mesure, c'est ce qui arrive, même avec Java. Vous passer des références à des objets, et non les objets eux-mêmes. Rappelez-vous, en fin de compte, chaque objet est un ensemble de bits dans la mémoire principale de l'ordinateur.

14voto

Steve Jessop Points 166970

Les indicateurs permettant de manipuler directement le contenu de la mémoire.

C'est à vous de savoir si vous pensez que c'est une bonne chose à faire, mais c'est la base de la façon dont tout se fait en C ou assembleur.

Les langages de haut niveau masquer les pointeurs de derrière les coulisses: par exemple, une référence en Java est mis en œuvre comme un pointeur dans presque toutes les JVM, vous allez venir à travers, qui est pourquoi il est appelé NullPointerException plutôt que l'exception NullReferenceException. Mais cela ne veut pas laisser le programmeur accéder directement à une adresse de mémoire il points de, et il ne peut pas être modifié pour prendre une valeur autre que l'adresse d'un objet de type approprié. Donc, il n'offre pas la même puissance (et la responsabilité) les pointeurs dans les bas-niveau langues.

[Edit: c'est une réponse à la question " c'est quoi cette obsession avec des pointeurs?'. Tout ce que j'ai comparé est de l'assembleur/C-style des pointeurs avec Java références. La question du titre a changé depuis: avais-je entrepris de répondre à la nouvelle question j'ai peut-être mentionné références dans des langues autres que Java]

12voto

Matthias Benkard Points 11264

C'est comme demander, "quelle est cette obsession avec les instructions du PROCESSEUR? Dois-je raté quelque chose en ne aspersion x86 instructions MOV tous sur la place?"

Vous avez juste besoin de pointeurs lors de la programmation de bas niveau. Dans la plupart de niveau supérieur langage de programmation mises en œuvre, les pointeurs sont utilisés aussi largement comme en C, mais caché à l'utilisateur par le compilateur.

Alors... Ne vous inquiétez pas. Vous êtes à l'aide de pointeurs déjà -- et sans les dangers de le faire de manière incorrecte, trop. :)

10voto

Fostah Points 4826

Je vois des pointeurs comme une transmission manuelle dans une voiture. Si vous apprenez à conduire avec une voiture qui a une boîte de vitesses automatique, ce qui n'est pas un mauvais pilote. Et vous pouvez toujours faire la plupart de tout ce que les pilotes qui ont appris sur une transmission manuelle peut faire. Il y aura juste un trou dans votre connaissance de la conduite. Si vous avez eu à conduire un manuel, vous seriez probablement en difficulté. Bien sûr, il est facile de comprendre le concept de base, mais une fois que vous avez à faire un démarrage en côte, vous êtes foutu. Mais, il y a encore une place pour les transmissions manuelles. Par exemple, des voitures de course, les pilotes doivent être en mesure de passer à la voiture pour répondre de la manière la plus optimale pour les actuelles conditions de course. Avoir une boîte de vitesses manuelle est très important de leur succès.

Ceci est très similaire à la programmation dès maintenant. Il est nécessaire pour le développement C/C++ sur certains logiciels. Quelques exemples sont haut de gamme à des jeux en 3D, le faible niveau des logiciels embarqués, des choses où la vitesse est un élément essentiel de la destination du logiciel et un langage de plus bas niveau qui permet de vous rapprocher de l'accès à des données réelles qui doit être traitée est la clé de cette performance. Cependant, pour la plupart des programmeurs, ce n'est pas le cas et ne sachant pas les pointeurs n'est pas rédhibitoire. Cependant, je crois que tout le monde peut bénéficier de l'apprentissage sur le C et des pointeurs, et les transmissions manuelles trop.

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