This should be okay, though:
char *p1 = 0;
int pv = (intptr_t)p1;
char *p2 = (char *)pv;
I.e. NULL must round-trip through intptr_t.