Il fatto di usare un oggetto o un puntatore ad un oggetto, come nel caso di tutti gli altri tipi di dati messi a disposizione, dipende dalle esigenze che hai.

Se devi allocare un numero di oggetti che dipende dall'input dell'utente, cosa utilizzi?

Per quanto riguarda l'esempio

int *a = 10;

e' un altro errore grave (!) ... e il compilatore non ti dovrebbe permettere tale scrittura.

Stai tentando di impostare il valore di un puntatore, e questo e' una cosa senza senso. Come fai a sapere che "l'indirizzo di memoria 10" conterra' un intero? O forse non hai ben chiaro che quel 10 che hai scritto rappresenta "l'indirizzo in memoria" di un dato?

Quello che puoi correttamente scrivere e'

int x;
int *a = &x;

oppure

int *a = new int;

e capirai le differenze con quello che hai scritto ...