A long pointer on most systems is 8 bytes (or 4, depending on architecture), while int is 4 bytes. When you assign &i (int pointer) to long* pointer p, there's a type mismatch. After p++, the difference p - &i is calculated as pointer arithmetic: p advances by sizeof(long) bytes, &i is the original address. The difference is the number of long-sized steps between them, which is 1.