Come da tuo titolo: il primo metodo e' statico, il secondo dinamico

Statico: myClass c;

tutte le risorse necessarie vengono allocate ancor prima che parta l'esecuzione del programma perché lo spazio occupato dalla classe e' definito in fase di compilazione.
Questo significa che sia che tu utilizzi veramente l'istanza oppure la dichiari solo (salvo ottimizzazioni del compilatore) lo spazio in memoria viene ugualmente riservato (e quindi sprecato in caso di inutilizzo)

Questo puo sembrare irrilevante per una piccola classe di esempio, ma quando queste iniziano a diventare strutture complesse contenenti array di grosse dimensioni lo spazio sprecato e' considerevole.
D'altra parte, in questo modo se la variabile viene sovrascritta spesso in questo modo si evita di ripetere continuamente la procedura di allocazioen in memoria.
L'occupazione di memoria perdura fino alla terminazione del programma. Questo metodo e' corretto se la variabile viene utilizzata durante gran parte del ciclo di vita del programma.

Dinamico : myClass *c= new myClass;
Sintassi propria di linguaggi ad "alto livello", in memoria viene riservato un puntatore (dimensioni trascurabili e indipendenti dalla classe) e l'istanza viene generata dinamicamente durante l'esecuzione e solo quando viene richiamata l'istruzione "new myClass;".
Un istanza generata con new puo quindi essere creata nel momento in cui serve e distrutta nell'istante stesso in cui non e' piu necessaria. (in modo da liberare risorse che potrebbero servire ad altri)

Tutto questo sembra insignificante per la maggior parte delle applicazioni che si scrivono, ma se pensi a un algoritmo di compressione/decompressione file che usa grandi quantitativi di memoria : non sarebbe carino che iniziasse a occupare il massimo della memoria potenzialmente necessaria ancor prima di dirgli su quali file dovrà lavorare.