2012-03-04 39 views
5

Simple pregunta es: ¿Por qué escribechar * foo vs char * foo

char *foo; 

y no

char* foo; 

Me explico: para mí (que viene de Java) una declaración es algo así como

<variable-type> <variable-name>; 

En el caso anterior Declaro una variable llamada foo de tipo char* (ya que es un puntero que apunta a char). Pero dondequiera que leo c/C++/C# -code parece una variable llamada *foo del tipo char. Al compilador no le importan los espacios en blanco, pero yo, como desarrollador, sí.

tl; dr lo que pido es una buena explicación para escribir char *foo en lugar de char* foo (lo que, como se ha explicado, parece más conveniente para mí).

+0

Sea específico acerca del idioma sobre el que está preguntando. C# normalmente no utiliza punteros, por lo que no está seguro de por qué lo incluyó. – Oded

+3

Olvidaste la forma más común 'char * foo'. – Lindydancer

+0

Consulte [Preguntas frecuentes de Stroustrup] (http://www2.research.att.com/~bs/bs_faq2.html#whitespace). –

Respuesta

11

pienso en la siguiente declaración:

char *p, c; 

Esto declara un puntero a char llamada p y una variable personaje llamado c. Esto muestra que no es exactamente correcto pensar que la declaración de variable tiene el formato simple y claro que describió.

+0

Entonces, para que el caso perezoso declare dos variables en la misma línea, lo usa en todas partes (incluso si parece no ser la mejor manera) - para mí - para hacerlo)? –

+1

No, es porque así es como funciona el lenguaje. El lenguaje no trata a un '*' lógicamente como parte del tipo, sino como un modificador de tipo que se une a la variable específica declarada, no a la declaración. En la línea de la respuesta, solo 'p' se 'modifica' para que sea un puntero. Así es como funciona el lenguaje. –

+0

@DavidSchwartz Más precisamente, el * es parte del declarador (8.0.0) y expande el tipo fundamental a un tipo compuesto. – cooky451

1

Siempre voy por la forma char* var. Exactamente por tu racionalidad Supongo que es una cuestión de hábito.

3

Para que quede claro, en C y C++, ambos son perfectamente legales, y no existe una única "mejor manera de hacerlo" acordada.

La razón para escribir es char *foo código como este:

char* foo, bar; 

esto no lo hace, como es de esperar en casualmente la lectura del código, declarar dos punteros de carbonilla. Declara un puntero de char (foo) y un char (bar).

Si desea declarar dos punteros de carbonilla, necesita esto:

char* foo, * bar; 

y que sólo se ve raro, por lo que una versión más consistente es la siguiente:

const *foo, *bar; 

esta es la única manera para dejar en claro que el * es realmente un calificador en esa variable específica, en lugar de estar vinculado al tipo.

Pero muchos, incluido yo mismo, preferimos lo mismo que usted, y siempre escribimos char* foo Entonces solo tengo que evitar declarar dos variables en una sola declaración como la anterior. En general, eso no es difícil. ;)

1

Una declaración de una variable se divide en tres partes: El tipo base, los declaradores y el nombre.Si se separa esto con comas, esto es lo que se obtiene:

char *a, b, c[5], *d[5]; 

Eran de un tipo es "puntero a char", "char" de b, del c "gama de 5 char" y D's "gama de 5 puntero carbonizarse". Esta es la razón por la cual en C y C++ sería más lógico escribir la estrella en el nombre, ya que no pertenece al tipo de base.

Sin embargo, pertenece al tipo y (tipo) (nombre) es más fácil de entender para las personas, es por eso que ves char * con mucha frecuencia. En mi opinión, ambas formas están perfectamente bien, siempre y cuando declares solo una variable en cada línea cuando vayas con char *. (Esto es lo que muchos estándares de codificación requieren de todos modos.)

Cuestiones relacionadas