¿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
Respuesta
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.
vítores amigo solo marcando :) – PeanutPower
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
Usan typedefs. –
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.
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
@ 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
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.
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.
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.
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 .
- 1. ¿Diferencia entre tipo [] varName y tipo varName []?
- 2. Diferencia entre #Define y Float?
- 3. MySQL: ¿Cuál es la diferencia entre float y double?
- 4. ¿Diferencia entre float y double en php?
- 5. de Javascript a PHP $$ varName
- 6. ¿Qué significa la "referencia indefinida a varName" en C?
- 7. C# 'insegura' función - * (float *) (& resultado) vs (float) (resultado)
- 8. ¿Cómo se diferencia printf y co entre float y double?
- 9. Convierte float [] en byte [] en float [] nuevamente
- 10. C++ float to int
- 11. Objective-C Float redondeo
- 12. Float Arc4random?
- 13. ¿Cuál es la diferencia entre 'a' y '_l?
- 14. Cadena ... <varname> lo que hace Cadena ... significa
- 15. Convirtiendo 'float' en 'byte [4]' y volviendo a 'float' en .NET Micro Framework
- 16. Pérdida de precisión convirtiendo 'float' en NSNumber, volviendo a 'float'
- 17. Comportamiento extraño del compilador con literales float vs variables float
- 18. ¿Cuál es la diferencia entre DefaultAppPool y Classic .NET AppPool en IIS7?
- 19. ¿Por qué hay una diferencia entre el mismo valor almacenado como float y double en Java?
- 20. CSS float y el relleno
- 21. HTML, desbordamiento: desplazamiento y float
- 22. ¿Cuál es la diferencia entre Visual C++ y C++?
- 23. ¿Cuál es la diferencia entre C++ administrado y C#?
- 24. ¿Cuál es la diferencia entre Managed C++ y C++/CLI?
- 25. ¿Cuál es la diferencia entre C y C incrustado?
- 26. ¿Cuál es la diferencia entre ofstream "<<" y Write
- 27. ¿Cuál es la diferencia entre Float.POSITIVE_INFINITY y Float.MAX_VALUE?
- 28. ¿Cuál es la diferencia entre 'int'? y 'int' en C#?
- 29. En C# ¿cuál es la diferencia entre ToUpper() y ToUpperInvariant()?
- 30. ¿Cuál es la diferencia entre File y FileInfo en C#?
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. –
Has abierto una lata de gusanos religiosa. :) Me sorprende que la mayoría de las respuestas hasta ahora sean moderadas. –
¿No fue esto ayer, pero con 'int' siendo el tipo? ¿Y la pregunta de ayer fue un duplicado de un duplicado de un duplicado? –