Premesso che credo di aver già risposto a queste domande, proviamo ad analizzare i tuoi dubbi...
però non ho capito perchè m coincide con &m[0])..
Il motivo come già detto nel precedente post è il seguente: l'identificatore di un array non è altro che un puntatore costante che contiene l'indirizzo di memoria del primo elemento dell'array.
Se poi intendi altro cerca di essere più chiaro.
se scrivo m[2] questo vuol dire che considero il primo elemento della terza riga? ( dato che la prima viene identificata con 0)
In C/C++ ad ogni variabile/costante è associato un tipo. Detto ciò, m[2] di che tipo è?
Per chiarirti un po' le idee potresti provare a lanciare il seguente codice ed osservarne l'output:
#include <iostream>
using namespace std;
int main()
{
int m[5][4] = {{ 1, 2, 3, 4},
{ 5, 6, 7, 8},
{ 9, 10, 11, 12},
{13, 14, 15, 16},
{17, 18, 19, 20}};
cout << m[2] << endl << &m[2][0] << endl << *(m + 2) << endl << endl;
cout << *m[2] << endl << m[2][0] << endl << **(m + 2) << endl << endl;
cout << m[2] + 3 << endl << &m[2][3] << endl << *(m + 2) + 3 << endl << endl;
cout << *(m[2] + 3) << endl << m[2][3] << endl << *(*(m + 2) + 3) << endl << endl;
}