web-dev-qa-db-fra.com

Façon correcte de déclarer des variables de pointeur en C / C ++

J'ai remarqué que certaines personnes utilisent la notation suivante pour déclarer des variables de pointeur.

(a) char* p;

au lieu de

(b) char *p;

J'utilise (b). Quel est le rationnel derrière la notation (a)? La notation (b) a plus de sens pour moi car le pointeur de caractère n'est pas un type lui-même. Au lieu de cela, le type est caractère et la variable peut être un pointeur vers le caractère.

char* c;

Cela ressemble à un type char * et la variable c est de ce type. Mais en fait, le type est char et * c (l'emplacement de mémoire pointé par c) est de ce type (char). Si vous déclarez plusieurs variables à la fois, cette distinction devient évidente.

char* c, *d;

Ça a l'air bizarre. Les deux c et d sont le même type de pointeurs qui pointent vers un caractère. En cela, puisque le suivant semble plus naturel.

char *c, *d;

Merci.

74
keeda

Bjarne Stroustrup a déclaré:

Le choix entre "int * p;" et "int * p;" ne concerne pas le bien et le mal, mais le style et l'accent. C accentué les expressions; les déclarations étaient souvent considérées comme un mal nécessaire. C++, d'autre part, met fortement l'accent sur les types.

Un "programmeur C typique" écrit "int * p;" et l'explique "* p est ce qui est l'int" en soulignant la syntaxe, et peut pointer vers la grammaire de déclaration C (et C++) pour plaider en faveur de l'exactitude du style. En effet, le * se lie au nom p dans la grammaire.

Un "programmeur C++ typique" écrit "int * p;" et l'explique "p est un pointeur vers un int" soulignant le type. En effet le type de p est int *. Je préfère clairement cet accent et le considère comme important pour bien utiliser les parties les plus avancées de C++.

Source: http://www.stroustrup.com/bs_faq2.html#whitespace

Je recommanderais ce dernier style parce que dans la situation où vous déclarez plusieurs pointeurs sur une seule ligne (votre 4ème exemple), avoir l'astérisque avec la variable sera ce à quoi vous êtes habitué.

92
BlackJack

Personnellement, je préfère placer le * avec le reste du type

char* p;  // p is a pointer to a char.

Les gens se disputeront "mais alors char* p, q; devient trompeur ", auquel je dis," alors ne fais pas ça ".

45
ikegami

Il n'y a aucune différence sur la façon d'écrire. Mais si vous voulez déclarer deux ou plusieurs pointeurs sur une même ligne, il vaut mieux utiliser la variante (b), car c'est clair ce que vous voulez. Regardez ci-dessous:

int *a;
int* b;      // All is OK. `a` is pointer to int ant `b` is pointer to int
char *c, *d; // We declare two pointers to char. And we clearly see it.
char* e, f;  // We declare pointer `e` and variable `f` of char type.
             // Maybe here it is mistake, maybe not. 
// Better way of course is use typedef:
typedef char* PCHAR;
PCHAR g, h;  // Now `g` and `h` both are pointers.
// If we used define construction for PCHAR we'd get into problem too.
29
George Gaál

Le compromis est

char * p;

K&R utilise

char *p;

Cela dépend de vous, sauf si vous suivez une norme de codage - dans ce cas, vous devez suivre ce que tout le monde fait.

9
jnnnnn

C'est une question de préférence, personnellement sur les projets dont je vois le caractère * j'ai tendance à déclarer plusieurs pointeurs sur des lignes distinctes. Il n'y a pas de véritable façon "correcte" de procéder et tout se résume à la préférence. Certains disent qu'il est plus facile de lire (a) tandis que d'autres disent que (b) est plus facile de déclarer plus de variables du même type sur la même ligne.

Je trouve que (b) est plus courant, et dans certains cas, j'ai vu

char * a;

ou quelque chose comme ça. Encore une fois la préférence. Quoi que vous soyez à l'aise ou quel que soit le projet sur lequel je travaille, je vais l'utiliser (sauf si je l'écris moi-même, auquel cas j'utilise (a))

2
Jesus Ramos