This creates an integer with the value of 10 somewhere in memory.
This creates a pointer to an int, and sets it to the address of the integer m (that is, the value of ab is the address of m).
printf("address of *ab:%p\n",&*ab);
So two things happen here. First, we dereference ab with *; this is, we actually go to the address held in ab which is where the value of m is stored. Then we get the address of this location with &; namely, the address of m. Hence this is ultimately just the address stored in ab to begin with. It's functionally equivalent to:
printf("value of ab:%p\n",ab);
printf("address of ab:%p\n",&ab);
This is the address of ab, where the pointer itself is stored in memory. So at this location you find ab, the value of which is the address of m.