En mi opinión, la respuesta es AMBAS, dependiendo de la situación. Generalmente, en mi opinión, es mejor poner el asterisco al lado del nombre del puntero, en lugar del tipo. Compare, por ejemplo:
int *pointer1, *pointer2; // Fully consistent, two pointers
int* pointer1, pointer2; // Inconsistent -- because only the first one is a pointer, the second one is an int variable
// The second case is unexpected, and thus prone to errors
¿Por qué el segundo caso es inconsistente? Porque, por ejemplo, int x,y;
declara dos variables del mismo tipo pero el tipo se menciona solo una vez en la declaración. Esto crea un precedente y un comportamiento esperado. Y int* pointer1, pointer2;
es inconsistente con eso porque se declara pointer1
como un puntero, pero pointer2
es una variable entera. Claramente propenso a errores y, por lo tanto, debe evitarse (colocando el asterisco al lado del nombre del puntero, en lugar del tipo).
Sin embargo , existen algunas excepciones en las que es posible que no pueda colocar el asterisco junto al nombre de un objeto (y dónde importa dónde lo ponga) sin obtener un resultado no deseado, por ejemplo:
MyClass *volatile MyObjName
void test (const char *const p) // const value pointed to by a const pointer
Finalmente, en algunos casos, podría decirse que sería más claro poner el asterisco al lado del nombre del tipo , por ejemplo:
void* ClassName::getItemPtr () {return &item;} // Clear at first sight