int * i; o int * i; o int * i; [cerrado]

30

¿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

lesmana
fuente
19
Yo preferiría centrarse en las demás líneas ... 3000
29
int*i;- el espacio en blanco no crece en los árboles, ya sabes ...
Shog9
Esta es esencialmente la misma pregunta; Aquí está mi respuesta .
Keith Thompson el

Respuestas:

75

Si tú escribes:

int* i, j, k;

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.

Randall Schulz
fuente
35
Y sugeriría que no int * i;sea ​​un contendiente solo porque parece una multiplicación de un vistazo.
John K
1
+1 porque no consideré este escenario antes.
Aparece el
44
"sugieres engañosamente que todo i, jyk son indicadores para int". A menos que esté escribiendo C #, donde int*se ve como un tipo y int* i, jdeclara dos punteros. La pregunta podría considerarse incompleta: depende del idioma que esté utilizando qué estilos son razonables. En CI siga int *x, en C # hago lo contrario.
Joren
1
@Joren: Lo siento, no siendo un programador de C #, simplemente asumí que al mirar el fragmento de código en la pregunta era C o C ++.
Randall Schulz
Creo que es perfectamente razonable suponer que es C o C ++ a menos que se mencione específicamente C #. Uno no ve punteros en C # muy a menudo.
alternativa del
62

Prefiero int* iporque itiene 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.

Tamás Szelei
fuente
8
Yo también sigo esta convención. Por la misma razón.
gablin
55
Personalmente, si estoy declarando múltiples punteros en mi código, lo trato como un olor a código. No debería necesitar tantos punteros; y usualmente no. Por lo tanto, el problema de las declaraciones múltiples en una sola línea nunca aparece en ningún código que escriba: una declaración por línea.
greyfade
55
El problema con esto es que el tipo no es un "puntero a un int". C (y C ++) no tiene un tipo de puntero. Es un puntero a un bloque de memoria, del cual es de tipo int.
Billy ONeal
10
Yo diría que *itiene un tipo de int.
Tim Goodman
55
@Billy: Si es así, nunca he visto esa confusión en 12 años de tratar de entender, analizar y explicar el estándar. "Puntero a un int" es un tipo perfectamente válido en C y C ++.
23

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 el int? *ies el int.

alternativa
fuente
2
Buen punto. Con los punteros, puede pensar en el inicio como parte del nombre. Por ejemplo, si tiene int i = 5, para obtener el valor de i, use el nombre i. Del mismo modo, si tiene int *i; *i = 5, entonces para obtener el valor, utilice *i.
mipadi
Leí int * i como: * i es un int. Por lo tanto, soy un puntero a int. Las declaraciones de variables en C usan expresiones de tipo, int y * son solo operadores. int * i analiza como int (* (i)) y se interpreta como si tuviera un tipo de puntero a entero. char * p [] se analiza como char (* ([] (p))) (porque [] tiene mayor prioridad que *) y significa: p tiene el tipo array-of pointer-to char.
Giorgio
Por esta razón, creo que eligieron escribir * al lado de la variable, porque * es un operador aplicado a ella.
Giorgio
7

Lo he preferido int* ipor años. Sin embargo, hay un fuerte argumento para int *iporque cuando se usa el estilo anterior, aún debe recordar la regla de declaración múltiple:

int* a, *b; // not int* a, b;

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
6

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:

int* a, b, c; // three pointers
Guffa
fuente
4

Si desea declarar múltiples variables pero no quiere 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 int* i estilo).

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:

identity<int[10]>::type a1, a2, a3;

identity<int&>::type r1(*p1), r2(*p2), r3(*p3);
flujo libre
fuente
Dios mío, c ++ siempre muestra algo nuevo para mí :). ¡Gracias!
Tamás Szelei
1
Dios mío, C ++ es horrible! typedef int* int_ptrHabrí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?
benzado
1
@benzado En la práctica, no necesitas el typedef ni ninguno de los trucos elegantes que demostré, porque ninguna persona sensata declara múltiples variables en una línea. Sin embargo, sigue siendo interesante.
fredoverflow
2
Lo sé, estaba hablando más sobre la tendencia de los programas de C ++ a usar funciones de lenguaje solo porque pueden hacerlo.
benzado
@benzado: !!! ¡He visto esto tan a menudo!
Giorgio
2

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 es inty el nombre es *i. Además, me int * i;parece un poco como la multiplicación.

Allon Guralnek
fuente
La sintaxis de la declaración C no es coherente a este respecto, ya que la información de tipo puede aparecer fácilmente después del identificador: las matrices son el ejemplo más claro.
@Roger: Lo sé, pero esta pregunta fue específicamente sobre una declaración de variable única, y nada más.
Allon Guralnek
Creo que eso está leyendo mucho. :) Según entiendo la pregunta, se trata de qué estilo usas en todas partes.
@Roger: Probablemente tengas razón, pero mi objetivo era responder a la pregunta del OP: "¿Cuál es tu método favorito para declarar un puntero?". Obviamente, todos son libres de mirar el tema presentado en la pregunta, e incluso se recomienda aquí. Como alguien que no se desarrolla en C / C ++, sentí que hacerlo se alejaría demasiado de mi campo de especialización.
Allon Guralnek
2

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;

Tamara Wijsman
fuente
1

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* intptren typedefsy 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 *identifiery class &identifieren los parámetros de la función para reforzar visualmente que el parámetro es potencialmente un parámetro llamado "fuera".
  • const int * const * constcada vez que uso calificadores cv .
  • int * foo; en declaraciones locales.

Supongo que soy algo visualmente orientado.

Greyfade
fuente
1

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.

Lexi Pim
fuente
66
"No hay tipos de puntero en C" - ¿De dónde sacaste esa idea? int*Es un tipo de puntero.
Keith Thompson el
-2

Lo uso int *iporque es más fácil ver que es un puntero, aunque no creo que sea realmente importante.

tia
fuente