124 votes

Placement de l'astérisque dans les déclarations de pointeurs

J'ai récemment décidé qu'il fallait que j'apprenne enfin le C/C++, et il y a une chose que je ne comprends pas vraiment à propos des pointeurs ou, plus précisément, de leur définition.

Voici quelques exemples :

  1. int* test;
  2. int *test;
  3. int * test;
  4. int* test,test2;
  5. int *test,test2;
  6. int * test,test2;

Or, si j'ai bien compris, les trois premiers cas font tous la même chose : Test n'est pas un int, mais un pointeur sur un int.

La deuxième série d'exemples est un peu plus délicate. Dans le cas 4, test et test2 seront tous deux des pointeurs sur un int, alors que dans le cas 5, seul test est un pointeur, tandis que test2 est un "vrai" int. Qu'en est-il du cas 6 ? Même chose que dans le cas 5 ?

15voto

huskerchad Points 666

Comme d'autres l'ont mentionné, les points 4, 5 et 6 sont identiques. Souvent, les gens utilisent ces exemples pour faire valoir que le * appartient à la variable et non au type. Bien qu'il s'agisse d'une question de style, il existe un débat sur la nécessité de penser et d'écrire les choses de cette manière :

int* x; // "x is a pointer to int"

ou de cette manière :

int *x; // "*x is an int"

Pour information, je suis dans le premier camp, mais la raison pour laquelle d'autres défendent la deuxième forme est qu'elle résout (en grande partie) ce problème particulier :

int* x,y; // "x is a pointer to int, y is an int"

ce qui peut induire en erreur ; il faudrait plutôt écrire soit

int *x,y; // it's a little clearer what is going on here

ou si vous voulez vraiment deux pointeurs,

int *x, *y; // two pointers

Personnellement, je dirais qu'il faut s'en tenir à une variable par ligne, le style que vous préférez n'ayant alors aucune importance.

11voto

FredOverflow Points 88201
#include <type_traits>

std::add_pointer<int>::type test, test2;

6voto

Joe Philllips Points 13616

C'est une bonne raison pour utiliser des lignes séparées pour chaque déclaration. Le * doit accompagner le nom de la variable si vous voulez qu'elle soit un pointeur.

5voto

1800 INFORMATION Points 55907

En 4, 5 et 6, test est toujours un pointeur et test2 n'est pas un pointeur. L'espace blanc n'est (presque) jamais significatif en C++.

3voto

Michel Billaud Points 1374

Le raisonnement en C est que vous déclarez les variables de la manière dont vous les utilisez. Par exemple

char *a[100];

dit que *a[42] sera un char . Et a[42] un pointeur de caractère. Et donc a est un tableau de pointeurs de caractères.

Cela s'explique par le fait que les auteurs du compilateur original voulaient utiliser le même analyseur pour les expressions et les déclarations. (Ce n'est pas une raison très sensée pour un choix de conception de langage).

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