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 un 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 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;
Cela a l'air bizarre. Les deux c et d sont les mêmes types de pointeurs qui pointent vers un caractère. En cela puisque le suivant semble plus naturel.
char *c, *d;
Merci.
la source
char *t
bien, alors je peux le faire à lachar * t;
place. Cependant, je l'ai souvent vuchar* t;
aussi.char
et (a) montre que p est unpointer to a char
Réponses:
Bjarne Stroustrup a déclaré:
Source: http://www.stroustrup.com/bs_faq2.html#whitespace
Je recommanderais ce dernier style car 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é.
la source
int *p
ce qui signifie: quandp
est déréférencé j'obtiens unint
. Ensuite, plusieurs déclarations séparées par ont du,
sens:int *p, *q, r
(quandp
ouq
est déréférencé j'obtiens unint
, quandr
est référencé j'obtiens unint
). En outre, la syntaxe du pointeur de fonction a du sens:int (*f)()
(quandf
est déréférencé et appelé, j'obtiens unint
). Et cela est logique:int *p, (*f)()
.int*
. Pour moi, celaint *p, (*f)()
n'a pas beaucoup de sens, mais je peux en quelque sorte voir ce que cela ferait à certaines personnes dans certaines situations.void*
(et ne fonctionne pas du tout pour les références C ++).Personnellement je préfère placer le
*
avec le reste du typeLes gens argumenteront "mais
char* p, q;
deviendront alors trompeurs", ce à quoi je dis "alors ne faites pas cela".la source
cout << *p;
. Alors pourquoi ne pas mettre l'étoile avantp
lors de la déclaration*p
:? À mon avis, ce serait moins déroutant.Il n'y a aucune différence comment écrire. Mais si vous voulez déclarer deux ou plusieurs pointeurs sur une ligne, mieux vaut utiliser la variante (b), car ce que vous voulez est clair. Regardez ci-dessous:
la source
typedef
n'est pas une meilleure façon "bien sûr". Certaines personnes pourraient le préférer, mais c'est problématique si plusieurs personnes travaillent avec votre code. Si je ne suis pas habituéPCHAR
, je pourrais écrire quelque chose commePCHAR *p;
, qui serait unchar**
et pas ce que je veux. En général, si vous voulez unchar**
, vous devez écrirePCHAR*
ou définir un nouveau type, puis cela commence à devenir stupide.Le compromis est
K&R utilise
C'est à vous de décider sauf si vous suivez une norme de codage - dans ce cas, vous devez suivre ce que tout le monde fait.
la source
char* p;
. c'est une question de style, pas de convention ou de règles. pour moi, il est plus logique que p soit de typechar*
, donc évidemment le * devrait être avec le type.clang-format
toute façon.C'est une question de préférence, personnellement sur les projets que je vois le char * J'ai tendance à déclarer plusieurs pointeurs sur des lignes séparées. Il n'y a pas de véritable façon «correcte» de faire cela 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
ou quelque chose comme ça. Encore une fois la préférence. Peu importe ce avec quoi vous êtes à l'aise ou quel que soit le projet sur lequel je travaille, j'utiliserai (sauf si je l'écris moi-même, auquel cas j'utilise (a))
la source