2010-07-14 3 views
28

Que se passe-t-il lorsque je déclare plusieurs variables sur une même ligne? par exemple.C plusieurs déclarations de ligne unique

int x, y, z; 

Tous sont des ints. La question est de savoir quels sont y et z dans l'énoncé suivant?

int* x, y, z; 

Sont-ils tous des pointeurs int?

+0

Question éditée, car elle n'a rien à voir avec l'objectif C –

+0

Je sais qu'il y a une copie de cette question quelque part ici (j'ai déjà lu ceci avant) –

Répondre

59

Seulement x est un pointeur vers int; y et z sont des entiers réguliers.

Ceci est un aspect de la syntaxe de déclaration C qui déclenche certaines personnes. C utilise le concept d'un , qui introduit le nom de l'objet déclaré ainsi que des informations de type supplémentaires non fournies par le spécificateur de type. Dans la déclaration

int* x, y, z; 

les déclarateurs sont *x, y et z (c'est un accident de la syntaxe C que vous pouvez écrire soit int* x ou int *x, et cette question est l'une des raisons pour lesquelles je recommande d'utiliser le second style). L'int-ness de x, y et z est spécifié par le spécificateur de type int, tandis que le pointeur de x-ness est spécifiée par le declarator *x (IOW, l'expression *x est de type int).

Si vous voulez que les trois objets soient des pointeurs, vous avez deux choix. Vous pouvez les déclarer comme pointeurs explicitement:

int *x, *y, *z; 

ou vous pouvez créer un typedef pour un pointeur int:

typedef int *iptr; 
iptr x, y, z; 

Rappelez-vous que lors de la déclaration d'un pointeur, la * fait partie du nom de la variable , pas le type.

+1

Vraiment une réponse complète et à celle de la question sous-jacente de savoir si le * est pour le type ou la variable. – ruralcoder

8

Dans votre première phrase:

int x, y, z; 

Ils sont tous int s.

Cependant, dans le second:

int* x, y, z; 

seulement x est un pointeur vers int. y et z sont simples int s.

Si vous voulez qu'ils soient tous des pointeurs vers int s que vous devez faire:

int *x, *y, *z; 
+3

C'est l'une des raisons pour lesquelles l'espacement 'int * foo;' est vraiment égaré. Dans l'exemple de cette question, cela donne l'impression que les 3 variables sont toutes de type "int" '". Je dirais que cet espacement est presque aussi offensant que 'a + b * c'. –

6

Seulement x est un pointeur int. Y et Z seront juste int. Si vous voulez trois pointeurs:

int * x, * y, * z; 
3

Il est important de savoir que, en C, la déclaration imite l'utilisation. L'opérateur * unaire est associatif à droite en C. Donc, par exemple en int *x x est du type pointeur sur un int (ou int-star) et en int x, x est de type int.

Comme d'autres l'ont également mentionné, dans int* x, y, z; le compilateur C déclare x comme int-star et, y et z comme entier.

Questions connexes