The first one is calculating an offset by taking the difference. This value can be used to increment an existing pointer by n values. It is basically the count of items between the two pointers.
E.g.
p4 = p3+(p2-p1);
is valid as it does increment p3 by the number of items between p2 and p1.
If you add on the other hand two pointers you are adding two addresses which will point to a memory location far far away in your allocated array and is definitely an error.