2010-04-18 11 views
80

duplicados posibles:
What makes more sense - char* string or char *string? Pointer declarations in C++: placement of the asterisk
Declarando punteros; asterisco a la izquierda o a la derecha del espacio entre el tipo y el nombre?

que he visto versiones mezcladas de esto en una gran cantidad de código. (Por cierto, esto se aplica a C y C++.) La gente parece declarar punteros de una de dos maneras, y no tengo idea de cuál es correcto, de si importa.

La primera manera en que para poner el asterisco adyacente el nombre del tipo, así:

someType* somePtr; 

La segunda manera es poner el asterisco adyacente al nombre de la variable, así:

someType *somePtr; 

Esto me ha estado volviendo loco durante algún tiempo. ¿Hay alguna forma estándar de declarar punteros? ¿Incluso importa cómo se declaran los punteros? He usado ambas declaraciones antes, y sé que al compilador no le importa de qué manera. Sin embargo, el hecho de que haya visto punteros declarados de dos maneras diferentes me lleva a creer que hay una razón detrás de esto. Tengo curiosidad si alguno de los métodos es más legible o lógico de alguna manera que me falta.

+0

La belleza es interna,! Externa. Embellecer la ejecución del código. –

+0

hecho varias veces antes. Ver en * menos * http://stackoverflow.com/questions/855566/pointer-syntax-variable-vs-variable-closed http://stackoverflow.com/questions/398395/in-c-why-is-the- asterisk-before-the-variable-name-rather-after-the-type http://stackoverflow.com/questions/558474/what-makes-more-sense-char-string-or-char-string – dmckee

+7

To asegúrese de que no es un tema fácil de buscar ... – dmckee

Respuesta

71

Es una cuestión de preferencia, y un poco de una guerra santa, al igual que el estilo corsé.

El estilo

someType* somePtr; 

está haciendo hincapié en el tipo de la variable puntero. Está diciendo, esencialmente, "el tipo de somePtr es puntero-a-someType".

El estilo

someType *somePtr 

está haciendo hincapié en el tipo de los datos de puntas a. Está diciendo, esencialmente, que "el tipo de datos apuntados por somePtr es someType".

Ambos significan lo mismo, pero depende de si el modelo mental de un programador determinado al crear un puntero está "enfocado", por así decirlo, en los datos apuntados o en la variable del puntero.

Ponerlo en el medio (como someType * somePtr) está tratando de evitar comprometerse con cualquiera de los dos.

+9

Puse un espacio alrededor del '*', pero no es para evitar cometer. Mi énfasis es definitivamente en los tipos, pero lo veo como un modificador de un tipo. Similar a la forma en que no se dice 'intconst', sino' int const'. La versión de "espacios por todos lados" también parece leer mejor cuando tienes 'const' en juego.' int const * const p; 'vs' int const * const q; '(o quizás los espacios mínimos que la gente prefiere' int const * const r; '?) –

+19

Puedo entender poner el espacio en ambos lados usando su razonamiento, aún así lo evitaría. Hace que todo se parezca demasiado a una multiplicación. –

+0

Convencionalmente, definimos variables usando' tipo nombre = val; 'por lo que podría decirse de manera más sucinta que' someType * somePtr' sigue s esta convención es más precisa donde 'someType *' es el tipo [de puntero] y 'somePtr' sigue siendo el nombre. Hacemos algo similar para las matrices cuando vamos a colocar los corchetes en el lado del tipo también (es decir, 'byte []'). Pero para ser honesto, si me preguntaras cómo escribo mis punteros, diría que actualmente todavía prefiero escribirlos como 'someType * somePtr' :) Para cada uno su ... – rdev5

43

No importa, es una preferencia personal.

Algunas personas les gusta mantener el tipo de juntas:

int* p; 

Otras personas opinan que debe ir junto a la variable por lo siguiente:

int *p, x;//declare 1 int pointer and 1 int 
int *p, *x;//declare 2 int pointers. 

Con el tiempo usted acaba de pasar por alto este y acepta ambas variaciones.

+0

Sí, este fue el caso que me ayudó a elegir 'int * p' sobre' int * p'. Para mí, esto significa que el asterisco tiene una relación con el identificador. –

-4

todos los sentidos que he visto es

TheType *myPointer 

debido a que se está declarando un puntero de tipo eltipo. Declaraciones similares

TheType myVar 

estarían declarando una variable de instancia de tipo TheType.

También se puede luego hacer claramente esto y tenerlo fácilmente legible

TheType myVar, *myPointer; 
+3

Lo he visto de esta manera también; sin embargo, nunca me gustó el razonamiento comúnmente repetido. En mi opinión, un puntero es un _type_, así que va con el resto de _el tipo_ como lo hace el modificador const. Escriba entre paréntesis "(const char *) var" es marginalmente un formato de tipo mejor que "(const char *) var".También la mayoría de las explicaciones se desmoronan en un área u otra. Las declaraciones favorecen poner la estrella al lado del nombre de la variable, pero el fundido favorece a la estrella junto al nombre del tipo (si está escribiendo para facilitar la lectura. Es una de las incoherencias del lenguaje de programación según C-as-escrito) –

80

No importa. Alguien ahora vendrá y cerrará la pregunta como una víctima, y ​​alguien más mostrará cómo se rompe la forma int* a si declara múltiples variables en las mismas declaraciones mientras que la forma int *a refleja mejor la estructura sintáctica del código, y otro tipo mostrará que Stroustrup prefiere la forma int* a.

Muchas opiniones, pero ninguna manera "correcta" aquí.

+33

Un verdadero maestro de SO para predecir todo esto temprano :) –

+1

No estoy seguro, pero ¿no hay una razón pragmática real relacionada con cómo el idioma gramm ar crea el análisis del asterisco? Si pienso en la declaración del puntero a la función ('rt (* f)()') y en la declaración de variables múltiples ('t * a, * b'), me encierran a creer que el asterisco califica al identificador en su ** right **, similar a like 'const' de hecho califica el identificador a su izquierda (excepto cuando primero está en la declaración). –

+0

@ v.odd ese argumento es lo que resumí como "la int * una forma que refleja mejor la estructura sintáctica" :) sin embargo, el propósito de escribir un buen código no es imitar de algún modo la gramática utilizada en el Estándar. En primer lugar, el código debería funcionar y ser mantenible, puede argumentar. –

13

Creo que es más claro poner el asterisco junto al nombre de la variable.

Puede declarar erróneamente someType* one, two; pensando que ambos son punteros pero solo la variable one es un puntero; two es solo un someType. Declarar como someType *one, *two evita este problema.

+0

Ok, pero la primera vez que escriba 'two-> doSomething()' verá instantáneamente el error que ha cometido en cualquier IDE moderno, así que esto realmente no es un gran problema. – mrt

+1

@mrt su argumento solo es verdadero si el tipo es uno que tiene miembros; Si el tipo es un escalar como 'int' o float, no hay miembros para llamar. –

+1

@ShammelLee Sí, tienes un punto ahí! No he pensado en tipos simples cuando di este comentario. – mrt

18

La diferencia surgió porque C++ añadió un sistema de tipo más fuerte en la parte superior de programador C. AC generalmente piensa en términos de "valores", por lo

int *pValue; 

lee "la dereference de valor p es un int" mientras un programador C++ piensa en "tipos" de modo

int* pValue; 

lee "el tipo de valores p es puntero a int" el compilador ve ninguna diferencia en absoluto, por supuesto. Sin embargo, descubrirá que es el programador C quien insiste en la "semántica de valores" cuando programa en C++.

+0

Solo para esta definición, estrecha y poco convencional de "semántica de valores". Para la definición común, es decir, que el retorno y el paso por el valor deben preferirse siempre que sea posible/práctico, eso definitivamente es algo de C++. C++ ha agregado progresivamente numerosas funciones para promover la semántica de valor por defecto, mientras que C no tiene ninguna, excepto la regla _as-if_, y esto tiende a alentar a las personas a pasar por el puntero. –

Cuestiones relacionadas