2010-01-24 22 views
7

¿Cuál es la diferencia entre float * varname y float * varname en classic C?¿Cuál es la diferencia entre float * varname y float * varname en classic c

+0

No hay diferencia, el compilador está feliz de cualquier manera. Los programadores "C" tienden a favorecer el espacio después del nombre del tipo, causa menos confusión cuando declara más de una variable. Esto * tiene * que ser engañado. –

+1

Has abierto una lata de gusanos religiosa. :) Me sorprende que la mayoría de las respuestas hasta ahora sean moderadas. –

+1

¿No fue esto ayer, pero con 'int' siendo el tipo? ¿Y la pregunta de ayer fue un duplicado de un duplicado de un duplicado? –

Respuesta

22

Formateo. Eso es. Quieren decir lo mismo.

Donde pone el espacio (o si tiene uno, de verdad) es una cuestión de preferencia. Algunos prefieren el * al lado del code para que no se confunda por algo como:

float* a, b; 

(aquí, sólo es un puntero, b no es)

Otros argumentan que nunca se declaran Varias variables a la vez, por lo que prefieren el * al lado de flotar, ya que es parte del tipo.

+0

vítores amigo solo marcando :) – PeanutPower

+2

Uno se pregunta cómo aquellos que ponen el '*' al lado de ' flotar' porque "es parte del tipo" alguna vez se las arregla para declarar matrices. – caf

+0

Usan typedefs. –

8

No hay diferencia. El espacio en blanco se ignora por completo.

Sin embargo tenga en cuenta que la siguiente puede ser engañoso:

float* var1, var2; 

examen casual de lo anterior que llevaría a pensar que tanto var1 y var2 son punteros a un flotador. Sin embargo, estarías equivocado, porque esto declara var1 como un puntero a un flotante, pero var2 sería un float regular.

+0

Es una cosa interesante que C considera que * se asocia más con el nombre de la variable que con el puntero-para escribir. Te hace desear el antiguo colon de Pascal como una desambiguación: separa el tipo compartido de la lista de nombres con modificadores. – Steve314

+1

@ Steve314 Pero piense en lo que sucede cuando tiene 'typedef int * foo_t;', luego 'foo_t a, b, c;'. En ese punto C "considera" que '' 'se asocia con el tipo. (Aunque yo diría que el lenguaje C realmente no "considera" nada ...) – asveikau

4

Este último es más explícito ya que muestra que está creando una variable que es un puntero a un flotante, en lugar de crear una variable que sea un puntero flotante. Esto se vuelve importante en construcciones tales como:

float *foo, bar; 

foo es un puntero a un flotador, pero el bar es sólo un flotador.

1

Principalmente, es una cuestión de estilo de codificación. Sin embargo, la mayoría de los programadores en C prefieren usar la segunda opción: float *var;, ya que está más cerca de cómo la sintaxis del lenguaje vincula el asterisco *: el * está vinculado al declarador, no al especificador de tipo.

En otras palabras, los programadores de C traducen float *var como *var es del tipo de flotador. pero no var es del tipo float*.

No es más elaborada explicación en el artículo de Wikipedia C variable types and declarations

Además, es posible que la cuestión C Pointer Syntax: Style poll interesing.

0

Como han dicho otros, no importa, es cuestión de estilo. Tenga en cuenta que en C++ es costumbre escribir:

type* var; 

Debido a que el puntero es parte del tipo - al menos eso cierto para los tipos personalizados. Pero por extensión también para tipos incorporados. Entonces tiene sentido en C hacer lo mismo para ser consistente. Personalmente, me parece más intuitivo tener el puntero como parte del tipo.

0

Efectivamente, no hay diferencia; la declaración se analiza como si se escribieron float (*varname);.

Tanto en C como en C++, las declaraciones se centran en expresiones, no en objetos; básicamente, la forma de la declaración debe coincidir con la forma de la expresión en el código ejecutable (IOW, la declaración imita el uso). Por ejemplo, si usted tiene un puntero a un entero llamado p y desea acceder a ese valor entero que p puntos a, deja de hacer referencia el puntero de este modo:

x = *p; 

El tipo de la expresión *p es int; por lo tanto, la declaración debe ser similar

int *p; 

Del mismo modo, si usted tiene una matriz de int llamado arr y desea acceder al valor entero en un elemento específico i, podría escribir

x = a[i]; 

El tipo de la expresión a[i] es int; por lo tanto, la declaración debe ser similar

int a[N]; 

En los ejemplos anteriores, *p y a[N] se llaman declaradores; los declaradores introducen el nombre del objeto declarado junto con información de tipo adicional no incluida en el especificador de tipo. El int-dad de ambos p y a se proporcionan por el especificador de tipo int, pero el puntero-dad de p y la matriz-dad de a se proporcionan por sus respectivos declaradores.

Este es un punto importante, y algo que debe ser estresado; el * de int *p; y int* p; está vinculado al declarador, no el especificador de tipo, independientemente del espacio en blanco. El hecho de que pueda escribir de cualquier manera es un accidente de sintaxis C (y C++), y como resultado hay una escuela de pensamiento que las variables de puntero deben declararse como T* p; en comparación con T *p;, ya que tipo de p es "puntero a T". Mi problema es que el razonamiento solo funciona para tipos de punteros simples; no podemos tratar la matriz o los tipos de funciones de la misma manera. Por ejemplo, no podemos escribir int[N] arr;, aunque el tipo de arr es "N-element array of int". Realmente cae cuando entramos en declarar punteros a matrices, o apuntadores a funciones, o combinaciones de tales. Por ejemplo:

int *(*(*(*farr)())[N])(); 

El tipo de farr es "puntero a una función que devuelve un puntero a una matriz N-elemento de punteros a funciones que devuelven punteros a int". Todo lo que no sea "int" es parte del declarador; escribir int* (*(*(*farr)())[N])(); o incluso int*(*(*(* farr)())[N])(); sería ... tonto.

Creo que insistir en escribir T* p; para las declaraciones de puntero resulta en más confusión, no menos.Al igual que Stroustrup y legiones de programadores de C++ quisieran pretender lo contrario, las declaraciones en C y C++ se centran en expresiones, no en objetos.

Ya que soy parte de un equipo más grande de escribir código C++, sigo la acordados directrices que incluyen declaran puntero y referencias como T* p; y T& r; de codificación, pero me hace rechinar los dientes cada vez que tengo que hacerlo .

Cuestiones relacionadas