Forma correcta de declarar variables de puntero en C / C ++

Noté que algunas personas usan la siguiente notación para declarar variables de puntero.

(a) char* p; 

en lugar de

 (b) char *p; 

Yo uso (b). ¿Cuál es la razón detrás de la notación (a)? La notación (b) tiene más sentido para mí porque el puntero del carácter no es un tipo en sí mismo. En cambio, el tipo es el carácter y la variable puede ser un puntero al personaje.

 char* c; 

Parece que hay un tipo char * y la variable c es de ese tipo. Pero, de hecho, el tipo es char y * c (la ubicación de la memoria señalada por c) es de ese tipo (char). Si declaras múltiples variables a la vez, esta distinción se vuelve obvia.

 char* c, *d; 

Esto se ve raro. Tanto c como d son el mismo tipo de punteros que apuntan a un personaje. En esto, ya que el próximo parece más natural.

 char *c, *d; 

Gracias.

Bjarne Stroustrup dijo:

La elección entre “int * p” e “int * p” no se trata de lo correcto y lo incorrecto, sino del estilo y el énfasis. C enfatizó expresiones; las declaraciones a menudo se consideraban poco más que un mal necesario. C ++, por otro lado, tiene un fuerte énfasis en los tipos.

Un “progtwigdor C típico” escribe “int * p” y lo explica “* p es lo que es el int” enfatizando la syntax, y puede apuntar a la gramática de statement C (y C ++) para argumentar a favor de la corrección del estilo. De hecho, el * se une al nombre p en la gramática.

Un “progtwigdor típico de C ++” escribe “int * p” y lo explica “p es un puntero a un int” tipo de énfasis. De hecho, el tipo de p es int *. Claramente prefiero ese énfasis y lo veo como importante para usar bien las partes más avanzadas de C ++.

Fuente: http://www.stroustrup.com/bs_faq2.html#whitespace

Yo recomendaría este último estilo porque en la situación en la que declaras múltiples punteros en una sola línea (tu 4to ejemplo), tener el asterisco con la variable será lo que estás acostumbrado.

Personalmente prefiero colocar el * con el rest del tipo

 char* p; // p is a pointer to a char. 

La gente discutirá “pero luego char* p, q; vuelve engañoso”, a lo que les digo: “así que no hagan eso”.

No hay diferencia de cómo escribir. Pero si quiere declarar dos o más punteros en una línea, mejor usar la variante (b), porque está claro lo que quiere. Mira abajo:

 int *a; int* b; // All is OK. `a` is pointer to int ant `b` is pointer to int char *c, *d; // We declare two pointers to char. And we clearly see it. char* e, f; // We declare pointer `e` and variable `f` of char type. // Maybe here it is mistake, maybe not. // Better way of course is use typedef: typedef char* PCHAR; PCHAR g, h; // Now `g` and `h` both are pointers. // If we used define construction for PCHAR we'd get into problem too. 

El compromiso es

 char * p; 

K & R usa

 char *p; 

Depende de usted, a menos que esté siguiendo un estándar de encoding; en ese caso, debe seguir lo que hacen los demás.

Es todo una cuestión de preferencia, personalmente en los proyectos que veo el char * Tiendo a declarar punteros múltiples en líneas separadas. No hay una manera “correcta” real de hacer esto y todo se reduce a las preferencias. Algunos dicen que es más fácil de leer (a) mientras que otros dicen que (b) es más fácil declarar más variables del mismo tipo en la misma línea.

Encuentro que (b) es más común y, en algunos casos, he visto

 char * a; 

o algo como esto. De nuevo preferencia. Lo que sea que te sientas cómodo o lo que sea que use el proyecto en el que estoy trabajando, lo usaré (a menos que lo escriba yo mismo, en cuyo caso uso (a))