Hi,
p2=p1+(!!p3);
In this statement you are incrementing the address contain in p1 by 1 or 0 based on the initial value in p3 and finally storing in p2.
For example p3 contains other that '\0' it means !p3 is non zero and !!p3 is again equal to 1, so statement will store the address contain in p1 plus 1 in p2.
Now other example p3 contains '\0' it means !p3 is equal to 1 and !!p3 is equal to 0, so statement will do nothing but copy the p1 in p2.
Just let me know if you have any doubt.