Comentarios
Responda
Si escribe:
int* i, j, k;
sugieres engañosamente que todos i, j y k son punteros a int
.
Por lo tanto, sostengo que es mejor anexar el * a la variable name.
Comentarios
Respuesta
Prefiero int* i
porque i
tiene el tipo «puntero a un int», y creo que esto lo hace uniforme con el sistema de tipos. Por supuesto, el comportamiento conocido entra en juego cuando se trata de definir varios punteros en una línea (es decir, el asterisco debe colocarse antes de cada nombre de variable para declarar un puntero), pero simplemente no declaro punteros de esta manera. Además, creo que es un defecto severo en los lenguajes de estilo C.
Comentarios
Respuesta
Para C, donde no tenemos un fuerte enfoque en los tipos, prefiero:
int *i;
Porque tiene un énfasis en el int
, no en el puntero. ¿Qué es el int
? *i
es el int.
Comentarios
Responder
He preferido int* i
durante años. Sin embargo, hay un fuerte argumento para int *i
porque cuando se usa el estilo anterior, aún debe recordar la regla de declaración múltiple:
int* a, *b; // not int* a, b;
Debido a que debes recordar esta regla, no obtienes nada de manera simple, pero tampoco diría que es más compleja. Evitar declaraciones múltiples en una línea es solo otra forma de decir que recuerdas esta regla .La diferencia entre los dos estilos es discutible.
Incluso cuando lo uso, sin embargo, se siente un poco tonto pretender que la sintaxis de declaración de C funciona de otra manera, colocando el asterisco al lado del tipo en lugar de que la variable a la que está enlazado sintácticamente.
No creo que enfatice el tipo de puntero (para i
) mientras que el otro enfatiza el tipo int (para *i
), pero puede ser que después de 15 años de uso de C y C ++, simplemente es cuando lo miro, sin tener que pensar en ello — algo La mayoría de los principiantes que hacen esta pregunta todavía no pueden hacerlo.
Además, incluso dada mi preferencia, no me resulta extraño leer / escribir código en el otro estilo. Consistencia, bla bla bla.
No es necesario ni siquiera mencionar int * i
.
Responder
Prefiero la primera. Es natural ya que ser un puntero es parte del tipo.
Como uso C #, maneja los tipos de una manera más intuitiva que C, por lo que no hay problema para declarar varios punteros en la misma declaración:
int* a, b, c; // three pointers
Responder
Respuesta
Si desea declarar varias variables pero no desea repetir el asterisco:
template <typename T> struct pointer_to { typedef T* type; }; pointer_to<int>::type p1, p2, p3;
(Como puede ver dentro de la plantilla de estructura, Prefiero el estilo int* i
.)
Y aquí hay una solución más general:
template <typename T> struct identity { typedef T type; }; identity<int*>::type p1, p2, p3;
Éste funciona con cualquier «tipo problemático», por ejemplo matrices y referencias:
Comentarios
Responder
Yo «iría por int* i;
ya que la primera parte denota el tipo de variable (puntero a int), mientras que la segunda parte denota el nombre (i
). No tendría sentido para mí que el tipo es int
y el nombre es *i
. Además, int * i;
me parece un poco a una multiplicación.
Comentarios
Respuesta
En declaraciones utilizo int * i;
, lo lees como i is a pointer to an integer
.
El puntero contribuye tanto al tipo como a la variable, por lo que debería estar en el medio.
Es bueno evitar declarar varias cosas en la misma línea: int * i, j;
Respuesta
¡No hay tipos de puntero en C! Entonces, «int * «no significa nada. El asterisco siempre está vinculado al elemento escrito a la derecha, pertenece al elemento que le corresponde.» * i «es un int. Y debido a que * i es un int, se sigue que i es un puntero a int. Esa es la lógica detrás de esto y es por eso que «int * i» es la única solución posible. Todo lo demás es una ilusión (que el compilador corrige automáticamente en la mayoría de los casos). En C ++ y C # eso es algo diferente. Pero para C sólo hay una Biblia: «Dennis M. Ritchie: El lenguaje de programación C». Dennis (¡RIP!) Lo escribió: «int * i». No es necesario cuestiona esto.
Comentarios
Respuesta
De hecho, utilizo las tres convenciones en circunstancias específicas. A primera vista, parezco inconsistente, pero …
-
int *
cuando el identificador no está presente, para reforzar visualmente que el nombre no está presente.
-
int* intptr
en typedef
sy declaraciones similares para reforzar visualmente que es parte del tipo. De manera similar con las declaraciones de puntero de función: (int* (*foo)(int))
-
int *identifier
y class &identifier
en los parámetros de la función para reforzar visualmente que el parámetro es potencialmente un parámetro llamado «out».
-
const int * const * const
siempre que uso cv calificadores.
-
int * foo;
en declaraciones locales.
Supongo que estoy algo orientado visualmente.
Respuesta
Utilizo int *i
porque es más fácil ver que es un puntero, aunque No creo que sea realmente importante.