Diciamo che è il contrario: sono i puntatori che si incrementano !
Allora un puntatore contiene un indirizzo di memoria.
Con l'operatore * accedi al contenuto di tale indirizzo.
Con l'operatore & ricavi l'indirizzo di una variabile.
Ora si assegna un tipo al puntatore perchè se no; non si saprebbe come accedere alla memoria corretamente.
Se il puntatore v contiene l'indirizzo 1000 ed è di tipo VERTEX, significa che l'indirizzo del prossimo elemento VERTEX sarà 1000 + dimensione del tipo VERTEX; quindi in generale:
indirizzo base + dimensione_tipo * indice

Ora quando fai v++, incrementi di uno * dimensione_tipo_puntatore l'indirizzo contenuto nel puntatore e poi lo assegni al puntatore stesso.
Con gli array in teoria non si può fare, dato che si usano gli indici, ma allo stesso tempo puoi utilizzare gli indici con i puntatori.
Detto questo il codice che hai postato è solo in parte giusto.
Primo perchè in m_vertexs deve puntare ad una zona di memoria sufficientemente grande da contenere gli elementi. Secondo perchè vengono allocati degli elementi di cui non si tiene traccia, e quindi non si possono disallocare.
Se vuoi accedere all'elemento 3 di m_vertexs, se m_vertexs contiene l'indirizzo dell'elemento 0:
m_vertexs[2]
se no:
m_vertexs[quanto_manca_alla_cella_3]

Se non ti sono stato chiaro, documentati ed informati sull'aritmetica dei puntatori.