web-dev-qa-db-fra.com

Déclarer des pointeurs; astérisque à gauche ou à droite de l'espace entre le type et le nom?

Doublons possibles:
Qu'est-ce qui a plus de sens - chaîne char * ou chaîne char *?Déclarations de pointeur en C++: placement de l'astérisque

J'ai vu des versions mixtes de ceci dans beaucoup de code. Soit dit en passant, cela s'applique au C et au C++. Les gens semblent déclarer les pointeurs de deux manières différentes, et je ne sais pas lequel est correct, même s'il a de l'importance.

La première façon de placer l'astérisque à côté du nom du type, comme ceci:

someType* somePtr;

La deuxième façon est de mettre l'astérisque à côté du nom de la variable, comme suit:

someType *somePtr;

Cela me rend fou depuis quelque temps. Existe-t-il un moyen standard de déclarer des pointeurs? La façon dont les pointeurs sont déclarés importe-t-elle même? J'ai déjà utilisé les deux déclarations auparavant et je sais que le compilateur ne se soucie pas de savoir comment. Cependant, le fait d'avoir vu des pointeurs déclarés de deux manières différentes m'amène à penser qu'il y a une raison derrière cela. Je suis curieux de savoir si l'une ou l'autre méthode est plus lisible ou logique d'une manière qui me manque.

111
jakogut

C'est une question de préférence, et une sorte de guerre sainte, tout comme le style brace.

Le style

someType* somePtr;

souligne le type de la variable de pointeur. Il dit essentiellement "le type de somePtr est un pointeur sur someType".

Le style

someType *somePtr

met l'accent sur le type des données pointées. Il dit essentiellement "le type de données pointé par somePtr est someType".

Les deux signifient la même chose, mais cela dépend si le modèle mental d'un programmeur donné lors de la création d'un pointeur est "concentré", pour ainsi dire, sur les données pointées ou la variable pointeur.

Le mettre au milieu (comme someType * somePtr) essaie d'éviter de s'engager envers l'un ou l'autre.

96
Tyler McHenry

Ça n'a pas d'importance. Quelqu'un va maintenant venir et fermer la question comme une dupe, et quelqu'un d'autre va montrer comment le int* a Way rompt si vous déclarez plusieurs variables dans les mêmes déclarations alors que le int *a Way reflète mieux la structure syntaxique du code, et un autre gars montrera que Stroustrup préfère le int* a façon.

Beaucoup d'opinions, mais pas de "bonne" façon ici.

113

Peu importe, c'est la préférence personnelle.

Certaines personnes aiment garder le type ensemble:

int* p;

D'autres personnes disent qu'il devrait passer à côté de la variable pour les raisons suivantes:

int *p, x;//declare 1 int pointer and 1 int
int *p, *x;//declare 2 int pointers.

Au fil du temps, vous allez simplement oublier et accepter les deux variantes.

51
Brian R. Bondy

La différence est due au fait que C++ a ajouté un système de type plus puissant au-dessus de C. Un programmeur C pense généralement en termes de "valeurs", donc

int  *pValue;

lit "le dereference de pValue est un int" alors qu'un programmeur C++ pense en "types" donc

int* pValue;

lit "le type pValue est un pointeur sur int" Bien sûr, le compilateur ne voit aucune différence. Cependant, vous constaterez que ce sont les programmeurs C qui insistent sur la "sémantique des valeurs" lors de la programmation en C++.

22
Lance Diduck

Je pense que mettre l'astérisque à côté du nom de la variable est plus clair.

Vous pourriez déclarer par erreur someType* one, two; pensant qu'il s'agit de deux pointeurs, mais que seule la variable one est un pointeur; two n'est qu'un someType. Déclarant comme someType *one, *two évite ce problème.

18
dteoh