¿Cuál es tu método favorito para declarar un puntero?
int* i;
o
int *i;
o
int * i;
o
int*i;
Por favor explique por qué.
ver también: http://www.stroustrup.com/bs_faq2.html#whitespace
c
coding-style
pointers
lesmana
fuente
fuente
int*i;
- el espacio en blanco no crece en los árboles, ya sabes ...Respuestas:
Si tú escribes:
sugieres engañosamente que todo i, j y k son punteros a
int
.Así que sostengo que es superior anexar * al nombre de la variable.
fuente
int * i;
sea un contendiente solo porque parece una multiplicación de un vistazo.int*
se ve como un tipo yint* i, j
declara dos punteros. La pregunta podría considerarse incompleta: depende del idioma que esté utilizando qué estilos son razonables. En CI sigaint *x
, en C # hago lo contrario.Prefiero
int* i
porquei
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 intento definir múltiples 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 grave en los lenguajes de estilo C.fuente
*i
tiene un tipo deint
.Para C, donde no tenemos un fuerte enfoque en los tipos, prefiero:
int *i;
Porque tiene un énfasis en el
int
, no el puntero. ¿Cuál es elint
?*i
es el int.fuente
int i = 5
, para obtener el valor dei
, use el nombrei
. Del mismo modo, si tieneint *i; *i = 5
, entonces para obtener el valor, utilice*i
.Lo he preferido
int* i
por años. Sin embargo, hay un fuerte argumento paraint *i
porque cuando se usa el estilo anterior, aún debe recordar la regla de declaración múltiple:Como debes recordar esta regla, no obtienes ninguna de forma explícita, pero tampoco diría que es más compleja. Evitar múltiples declaraciones en una línea es solo otra forma de decir que recuerda esta regla. La diferencia entre los dos estilos es discutible.
Sin embargo, incluso cuando lo uso, se siente un poco tonto fingir que la sintaxis de declaración C funciona de otra manera, colocando el asterisco al lado del tipo en lugar de la variable a la que está sintácticamente vinculado.
Yo no creo en que uno hace hincapié en el tipo de puntero (para
i
) mientras que el otro hace hincapié en el tipo int (para*i
), pero que puede ser que después de 15 años de uso C y C ++, sólo es cuando miro a ella, sin tener que pensarlo, algo que la mayoría de los principiantes que hacen esta pregunta aún no pueden hacer.Además, incluso dada mi preferencia, no me resulta incómodo leer / escribir código en el otro estilo. Consistencia, bla bla bla.
No hay necesidad de mencionarlo
int * i
.fuente
Prefiero la primera. Se vuelve 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:
fuente
Prefiero
int* i
(estilo C ++).Evito declarar múltiples variables en una declaración debido a la ambigüedad visual resultante (
int* i, j
).Consulte también las Preguntas frecuentes sobre el estilo y la técnica C ++ de Bjarne Stroustrup para conocer los fundamentos.
fuente
Si desea declarar múltiples variables pero no quiere repetir el asterisco:
(Como puede ver dentro de la plantilla de estructura, prefiero el
int* i
estilo).Y aquí hay una solución más general:
Éste funciona con cualquier "tipo problemático", por ejemplo, matrices y referencias:
fuente
typedef int* int_ptr
Habría hecho el truco. Claro, tengo que declarar un nuevo typedef para diferentes tipos de punteros, pero en la práctica, ¿cuántos serán? ¿Ocho como máximo?Yo iría
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 esint
y el nombre es*i
. Además, meint * i;
parece un poco como la multiplicación.fuente
En las declaraciones que uso
int * i;
, lo lees comoi is a pointer to an integer
.El puntero contribuye tanto al tipo como a la variable, por lo que debe estar en el medio.
Es bueno evitar declarar varias cosas en la misma línea:
int * i, j;
fuente
De hecho, uso 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
entypedef
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
yclass &identifier
en los parámetros de la función para reforzar visualmente que el parámetro es potencialmente un parámetro llamado "fuera".const int * const * const
cada vez que uso calificadores cv .int * foo;
en declaraciones locales.Supongo que soy algo visualmente orientado.
fuente
No hay tipos de puntero en C! Entonces, "int *" no significa nada. El asterisco siempre está ligado al elemento escrito correctamente, pertenece al elemento correcto. "* i" es un int. Y debido a que * i es un int, se deduce que soy 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 solo hay una biblia: "Dennis M. Ritchie: El lenguaje de programación C". Dennis (¡RIP!) Lo escribió: "int * i". No hay necesidad de cuestionar esto.
fuente
int*
Es un tipo de puntero.Lo uso
int *i
porque es más fácil ver que es un puntero, aunque no creo que sea realmente importante.fuente