I wouldn't say weigh's..It's the size. A byte is 8 bits.
As far as the difference. One is the size of a pointer which is 4 bytes and the other is the size of an int (long in this case) which is 8 bytes. just realized that it was the address of the pointer and not the dereferencing the pointer. So the later is a pointer to a pointer as peter mentioned.
&p gives a pointer to the pointer p so both are actually the size of pointers.
I'm surprised that your compiler does not use the same size for all pointers (except function pointers). I guess it's allowed by the standard but I don't see any good reason for it. What compiler, and on what system, are you using?