We have to understand here this way :
a) 'p' is itself a pointer variable . So taking the address of it followed by dereferencing will give back 'p' itself . And 'p' is nothing but the address of 'i' .
b) Similarly if we dereference 'p' we get 'i' as 'p' contains the address of 'i' . Now when we again put '&' on it means that we are referring to the address of i only and hence in short we are concerned about &i .
c) The same is given as third argument of printf() in direct form.
Hence all of : &*p , *&p and &i will give the same value which is the address of 'i' specifically.