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 pointer1come 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