web-dev-qa-db-fra.com

Y a-t-il une différence entre les pointeurs et les références?

Les références et les pointeurs font la même chose que je sache. Y a-t-il une différence entre eux?

S'il n'y a pas de différence, pourquoi nous les appelons référence non à un pointeur?

8
yfklon

De manière générale, vous pouvez faire la distinction suivante:

A Référence est une variable qui fait référence à autre chose et peut être utilisée comme un alias pour cette autre chose.

A pointeur est une variable qui stocke une adresse mémoire, dans le but d'agir comme un alias à ce qui est stocké à cette adresse.

Donc, un pointeur est une référence, mais une référence n'est pas nécessairement un pointeur.

Les pointeurs constituent une mise en œuvre particulière du concept de référence et le terme a tendance à être utilisé uniquement pour les langues qui vous donnent un accès direct à l'adresse mémoire.

Les références peuvent être implémentées en interne dans une langue utilisant des pointeurs ou en utilisant un autre mécanisme. Par exemple, Perl a Références symboliques , qui font référence à la variable par nom plutôt qu'à l'emplacement de la mémoire. C'est pourquoi le code étrange comme celui-ci fonctionne:

my $bar = "foo";
$$bar = "Am I foo or bar?"; #This is actually a reference to $foo!
print $foo;

Cette distinction entre les références et les pointeurs n'est pas une règle dure et rapide (C++ étant l'exception principale, car elle a à la fois des références et des pointeurs, avec une signification distincte pour chaque) mais couvre la majeure partie de l'utilisation.

19
user82096

Il n'y a pas de différence généralement acceptée entre les pointeurs et les références si vous regardez une large distribution de langues à l'aide des termes. La variante des mêmes concepts utilise à la fois des termes (et un autre accès) presque indifféremment, mais certaines caractéristiques ont tendance à être étroitement associées à l'un des termes:

  • si l'arithmétique est disponible, je n'ai jamais vu le terme référence utilisé. (Mais le pointeur n'implique pas que l'arithmétique est disponible)

  • si l'objet référencé ne peut pas être modifié, je n'ai jamais vu le pointeur à terme utilisé excepté lorsqu'il y a une propriété constante pouvant être appliquée au pointeur ainsi qu'à d'autres choses. (Mais la référence n'implique pas la non-rebindabilité).

6
AProgrammer

Les pointeurs et les références sont un espace réservé pour utiliser des objets.

Au lieu d'utiliser l'objet lui-même, vous pouvez utiliser un pointeur ou une référence à l'accès et/ou à manipuler l'objet.

Car myCar = new Car();
Car& myCarReference = myCar;

Changer le contenu de MyCarreference changera le contenu de Mycar.

Les pointeurs ajoutent des opérations d'adresse puissantes mais potentiellement dangereuses aux références. Par exemple:

Car* myCarPointer;

    // 0x12345678=the memory adress where one car 
    // object is supposed to be in memory.
myCarPointer = 0x12345678;  
myCarPointer->setColor(red);

myCarPointer+=20;  // advance 20 cars in an array

Des moyens potentiellement dangereux "Vous pouvez attribuer n'importe quelle adresse à un pointeur. Le pointeur peut pointer sur un emplacement où il n'y a pas d'objet de voiture.

Langues comme Java et c # introduit des références pour rendre les programmeurs plus robustes par rapport à C/C++ qui n'ont que des pointeurs

4
k3b

Vous êtes juxtaposez les mauvaises choses. En C++, les pointeurs et les références ont des significations différentes, mais parce que vous ne demandez pas de C++, je soupçonne que ce n'est pas ce que vous êtes après. Si vous êtes, consultez la réponse de Harsh.

Ce que vous voulez probablement savoir est la différence entre une référence à un objet et à l'objet lui-même. Dans la plupart des langues plus récentes, vous pouvez transmettre un objet par valeur ou par référence.

Passer un objet par valeur signifie en faire une copie. Vous pouvez modifier cette copie sans affecter l'original. L'établissement de cette copie peut cependant coûter beaucoup d'accès à la mémoire.

Passer un objet par référence signifie passer une poignée à cet objet. Ceci est moins cher parce que vous n'avez pas besoin de faire une copie. Cela signifie également que toutes les modifications que vous apportez affecteront l'original.

Les langages de programmation fonctionnelle auront tendance à tout transmettre de valeur car cela évite les effets secondaires.

2
Steve Rowe

Les pointeurs et les références ont l'air assez différents (les pointeurs utilisent les opérateurs * et ->, les références utilisent.), Mais ils semblent faire des choses similaires. Les deux pointeurs et les références vous permettent de faire référence à d'autres objets indirectement. Comment, alors décidez-vous quand utiliser un et non l'autre? Tout d'abord, reconnaissez qu'il n'y a pas de référence nulle. Une référence doit toujours faire référence à un objet. En conséquence, si vous avez une variable dont le but est de faire référence à un autre objet, mais il est possible qu'il ne s'agisse pas d'un objet de se référer, vous devez rendre la variable un pointeur, car vous pouvez ensuite la définir à NULL. D'autre part, si la variable doit toujours faire référence à un objet, c'est-à-dire si votre conception ne permet pas la possibilité que la variable soit nulle, vous devez probablement faire une référence variable.

pour plus de référence http://www.cplusplus.com/articles/enywvcm9/

1
Harssh