In ISO/IEC 9899:TC2, the standard says following
6.3.2.3 Pointers
- A pointer to an object or incomplete type may be converted to a pointer to a different object or incomplete type. If the resulting pointer is not correctly aligned for the pointed-to type, the behavior is undefined. Otherwise, when converted back again, the result shall compare equal to the original pointer. When a pointer to an object is converted to a pointer to a character type, the result points to the lowest addressed byte of the object. Successive increments of the result, up to the size of the object, yield pointers to the remaining bytes of the object.
So, it is not clear from the standard that a pointer of one type can be casted to pointer of another type.
Strict aliasing rule is defined somewhere else. This is the wording:
C (ISO/IEC 9899:1999 6.5/7):
C++ (ISO/IEC 14882:2011 3.10 [basicl.lval] / 15):
The C standard doesn't prohibit you from casting the pointer to an unrelated type, provided there are no allignment problems. However, due to the strict aliasing rule, you basically can't dereference a pointer obtained from such a cast. So the only useful thing to do with such "invalid" pointer is to cast it back to the correct type (or a compatible type).
It's mostly the same in C++ with reinterpret_cast (5.2.10 [expr.reinterpret.cast] / 7):