2010-07-14 14 views
28

¿Qué sucede cuando declaro decir múltiples variables en una sola línea? p.ej.C múltiples declaraciones de línea única

int x, y, z; 

Todos son ints. La pregunta es ¿qué son y y z en la siguiente declaración?

int* x, y, z; 

¿Son todos los punteros int?

+0

Pregunta editada, ya que no tiene nada que ver con el Objetivo C –

+0

Sé que hay un duplicado de esta pregunta en algún lugar aquí (definitivamente lo he leído antes) –

Respuesta

59

Sólo x es un puntero a int; y y z son entradas regulares.

Este es un aspecto de la sintaxis de la declaración C que hace saltar a algunas personas. C utiliza el concepto de declarator, que introduce el nombre de la cosa que se declara junto con información de tipo adicional no proporcionada por el especificador de tipo. En la declaración

int* x, y, z; 

los declaradores son *x, y y z (que es un accidente de la sintaxis de C que se puede escribir ya sea int* x o int *x, y esta cuestión es una de las varias razones por las que recomiendo usar el segundo estilo) El int-dad de x, y, y z es especificado por el especificador de tipo int, mientras el puntero-dad de x se especifica por el declarador *x (OIA, la expresión *x tiene tipo int).

Si desea que los tres objetos sean punteros, tiene dos opciones. Se puede declarar ya sea como punteros de forma explícita:

int *x, *y, *z; 

o puede crear un typedef de un puntero int:

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

Sólo recuerde que cuando se declara un puntero, el * es parte del nombre de la variable no el tipo

+1

Verdaderamente una respuesta completa y a la de la pregunta subyacente de si el * es para el tipo o la variable. – ruralcoder

8

En su primera frase:

int x, y, z; 

todos ellos son int s.

Sin embargo, en la segunda:

int* x, y, z; 

Sólo x es un puntero a int. y y z son simples int s.

Si desea que todos sean punteros a int s que hay que hacer:

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

Esta es una razón por la que el espaciado 'int * foo;' es realmente equivocado. En el ejemplo de esta pregunta, hace que parezca que las 3 variables son todas del tipo "' int * '". Diría que este espaciado es casi tan ofensivo como 'a + b * c'. –

6

Sólo x es un puntero int. Y y Z serán solo int. Si desea tres punteros:

int * x, * y, * z; 
3

Es importante saber que, en C, la declaración imita el uso. El * operador unario es asociativo correcto en C. Entonces, por ejemplo, en int *x x es del tipo puntero a int (o int-star) y en int x, x es de tipo int.

Como otros también han mencionado, en int* x, y, z; el compilador de C declara x como un int-star y, y y z como un entero.

Cuestiones relacionadas