78 votes

C++ : différence entre l'esperluette "&" et l'astérisque "*" dans la déclaration d'une fonction/méthode ?

Y a-t-il une sorte de différence subtile entre eux :

void a1(float &b) {
    b=1;
};
a1(b);

et

void a1(float *b) {
    (*b)=1;
};
a1(&b);

?

Elles font toutes deux la même chose (du moins, c'est ce qu'il semble d'après main() ), mais la première est manifestement plus courte, alors que la plupart du code que je vois utilise la seconde notation. Y a-t-il une différence ? Peut-être dans le cas où il s'agit d'un objet au lieu d'un flottant ?

1voto

Fonctionnellement, dans votre exemple, les deux versions font la même chose.

La première a l'avantage d'être transparente du côté de l'appel. Imaginez ce que cela donnerait pour un opérateur :

cin >> &x;

Et comment c'est laid pour une invocation de swap

swap(&a, &b);

Vous voulez échanger a et b. Et c'est beaucoup mieux que lorsque vous devez d'abord prendre l'adresse. À propos, bjarne stroustrup écrit que la raison principale des références était la transparence ajoutée du côté de l'appel - en particulier pour les opérateurs. Voyez aussi comment il n'est plus évident de savoir si l'opération suivante

&a + 10

ajouterait 10 au contenu de a, en appelant l'opérateur+ de celui-ci, ou s'il ajoute 10 à un pointeur temporaire vers a. Ajoutez à cela l'impossibilité de surcharger des opérateurs pour des opérandes intégrés uniquement (comme un pointeur et un entier). Les références rendent cela très clair.

Les pointeurs sont utiles si vous voulez pouvoir mettre un "null" :

a1(0);

Ensuite, en a1, la méthode peut comparer le pointeur avec 0 et voir si le pointeur pointe vers un objet quelconque.

0voto

RnR Points 1268

Une grande différence à noter est que ce qui se passe à l'extérieur, vous l'avez soit :

a1(something);

ou :

a1(&something);

J'aime passer les arguments par référence (toujours une constante :) ) quand ils ne sont pas modifiés dans la fonction/méthode (et alors vous pouvez aussi passer des objets automatiques/temporaires à l'intérieur) et les passer par pointeur pour signifier et alerter l'utilisateur/le lecteur du code appelant la méthode que l'argument peut et est probablement modifié intentionnellement à l'intérieur.

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