In addition to what pogrady said, even though your last two statements results in the same value for p, it is technically different.
Your third statement passes the address so any changes made to int m will cause p to change. Your second statement only sends a copy of the value of m to pointer p so if m is changed later, the value of p will not change.
Ex:
1 2 3 4 5 6 7 8
int m = 100;
int *ptr = &m;
cout << *ptr;
m = 400;
cout << *ptr;
100 then 400 is displayed since the address of m is passed to pointer p.