En C, ¿cuál es la sintaxis correcta para declarar punteros?

5 minutos de lectura

avatar de usuario
edd

Recuerdo vagamente haber visto esto antes en una respuesta a otra pregunta, pero la búsqueda no ha dado la respuesta.

no recuerdo cual es el adecuado forma de declarar variables que son punteros. Lo es:

Type* instance;

O:

Type *instance;

Aunque sé que ambos compilarán en la mayoría de los casos, creo que hay algunos ejemplos en los que es significativo, posiblemente relacionado con la declaración de múltiples variables del mismo tipo en la misma línea, por lo que una tiene más sentido que la otra.

  • posible duplicado de declaraciones de puntero en C++: ubicación del asterisco

    – Qadi

    4 de noviembre de 2014 a las 18:17

Es simplemente una cuestión de cómo te gusta leerlo.

La razón por la que algunas personas lo ponen así:

Type *instance;

Es porque dice que la única instancia es un puntero. Porque si tienes una lista de variables:

int* a, b, c;

Solo a es un puntero, por lo que es más fácil así

int *a, b, c, *d;

Donde tanto a como d son punteros. En realidad, no hace ninguna diferencia, se trata solo de legibilidad.

A otras personas les gusta tener el * junto al tipo porque (entre otras razones) lo consideran un “puntero a un número entero” y piensan que el * pertenece al tipo, no a la variable.

Personalmente, siempre lo hago

Type *instance;

Pero realmente depende de usted y de las pautas de estilo de código de su empresa/escuela.

  • Esto fue todo, creo. Fue la declaración de múltiples variables seguidas, y no podía recordar si el compilador trató “Tipo*” como un tipo, o si * era más como un modificador en una variable que indicaba que era un puntero a una instancia de tipo “Escribe”. int* a,b,c sería confuso para mí, así que usaré Type *instance en el caso de que no existan otras pautas.

    – Edd

    19 de julio de 2010 a las 11:58

  • yo suelo int * en C y int* en C++. En C++, generalmente es una buena práctica declarar los identificadores uno por uno, por lo que el argumento “int* a, b, c es esponjoso” es menos significativo. La consistencia del sistema de tipos es una gran preocupación en el caso de C++.

    – Alejandro C.

    19 de julio de 2010 a las 13:01

avatar de usuario
Ponto Gagge

Esos dos son iguales. Sin embargo, si hace varias declaraciones, la primera puede atraparlo.

int* pi, j;

declara un puntero int (pi) y un int (j).

Es un accidente de la sintaxis C que puede escribirlo de cualquier manera; sin embargo, siempre se analiza como

Type (*pointer);

eso es el * siempre está vinculado al declarador, no al especificador de tipo. si escribiste

Type* pointer1, pointer2;

se analizaría como

Type (*pointer1), pointer2;

por lo que solo pointer1 se declararía como un tipo de puntero.

C sigue un paradigma de “declaración que imita el uso”; la estructura de una declaración debe imitar la expresión equivalente utilizada en el código tanto como sea posible. Por ejemplo, si tiene una matriz de punteros a int llamada arry desea recuperar el valor entero al que apunta el i-ésimo elemento en la matriz, subíndice la matriz y elimina la referencia al resultado, que se escribe como *arr[i] (analizado como *(arr[i])). el tipo de expresión *arr[i] es intpor lo que la declaración de arr se escribe como

int *arr[N];

de que manera es Correcto? Depende de a quién le preguntes. Viejo C pedos como yo favor T *p porque refleja lo que realmente está sucediendo en la gramática. Muchos programadores de C++ favorecen T* p porque enfatiza el tipo de pque se siente más natural en muchas circunstancias (habiendo escrito mis propios tipos de contenedor, puedo ver el punto, aunque todavía me parece incorrecto).

Si desea declarar varios punteros, puede declararlos todos explícitamente, como:

T *p1, *p2, *p3;

o puede crear un typedef:

typedef T *tptr;
tptr p1, p2, p3;

aunque personalmente no lo recomiendo; ocultar la puntería de algo detrás de un typedef puede morderte si no tienes cuidado.

  • Ocultar el puntero de algo con un typedef puede ser bastante útil cuando se usan punteros inteligentes. Escribiendo MyClassPtr es mucho más rápido que boost::shared_ptr<MyClass>por ejemplo.

    – Pedro d’Aquino

    19 de julio de 2010 a las 15:03

  • También es un fastidio tener que rastrear varios cientos de líneas de diagnósticos de plantilla porque un iterador no se desreferencia correctamente; es decir, se suponía que debías escribir (*it)->foo() en lugar de it->foo()pero debido a que el iterador fue declarado como vector<a_typedef_name_that_doesn't_indicate_pointerness_AT_ALL>::iterator en lugar de vector<T*>::iterator, no te diste cuenta de que la desreferencia adicional era necesaria. Esa no fue la tarde más productiva.

    – Juan Bode

    19 de julio de 2010 a las 15:43

avatar de usuario
Michael Foukarakis

Esos dos son exactamente iguales.

Sin embargo, a los efectos de declarar múltiples variables, como se muestra a continuación:

int * p1, p2;

donde p1 es de tipo puntero a int, pero p2 es de tipo int. Si desea declarar p2 como un puntero a int, debe escribir:

int *p1, *p2;

avatar de usuario
dave o.

Prefiero el siguiente estilo:

Type *pointer;

¿Por qué? Porque es consistente con la mentalidad que los creadores del lenguaje intentaron establecer:

“La sintaxis de la declaración de una variable imita la sintaxis de las expresiones en las que podría aparecer la variable”.

(El lenguaje de programación C de Brian W. Kernighan y Dennis M. Ritchie, versión ansi c, página 94)

Es fácil escribir FORTRAN en cualquier idioma, pero siempre debes escribir [programming language X] en [programming language X].

avatar de usuario
Cachorro

Curiosamente, esta regla no se aplica si el tipo se deduce en C++0x.

int a;
decltype(&a) i, j;

Tanto i como j son int*.

avatar de usuario
mike facio

Todos estos compilarán, son legales y son equivalentes:

Type* instance;
Type * instance;
Type *instance;

Elige un estilo y sé constante.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad