A mio parere, la risposta è ENTRAMBE, a seconda della situazione. In generale, IMO, è meglio mettere l'asterisco accanto al nome del puntatore, piuttosto che il tipo. Confronta ad esempio:
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
Perché il secondo caso è incoerente? Perché ad esempio int x,y;
dichiara due variabili dello stesso tipo ma il tipo è menzionato solo una volta nella dichiarazione. Questo crea un comportamento precedente e previsto. Ed int* pointer1, pointer2;
è incoerente con questo perché si dichiara pointer1
come un puntatore, ma pointer2
è una variabile intera. Chiaramente incline agli errori e, quindi, dovrebbe essere evitato (mettendo l'asterisco accanto al nome del puntatore, piuttosto che il tipo).
Tuttavia , ci sono alcune eccezioni in cui potresti non essere in grado di mettere l'asterisco accanto al nome di un oggetto (e dove è importante dove lo metti) senza ottenere risultati indesiderati, ad esempio:
MyClass *volatile MyObjName
void test (const char *const p) // const value pointed to by a const pointer
Infine, in alcuni casi, potrebbe essere più chiaro mettere l'asterisco accanto al nome del tipo , ad esempio:
void* ClassName::getItemPtr () {return &item;} // Clear at first sight