Это определено в /usr/include/stdint.h:
/usr/include/stdint.h
typedef long int intptr_t;
это тип целого числа или указатель?
Это целочисленный тип со знаком, который достаточно большой, чтобы содержать указатель.
Это целочисленный тип со знаком, который гарантированно может содержать тип void*.
void*
И почему существует также [u]intptr_t?Потому что:
[u]intptr_t
Любой действительный указатель на void можно преобразовать в intptr_t или uintptr_t и обратно без изменения значения.Стандарт C гарантирует, что указатель на void может быть преобразован в или из указателя на любой тип объекта и обратно и что результат должен сравниваться равным исходному указателю.Следовательно, преобразование напрямую из указателя char * в uintptr_t разрешено в реализациях, которые поддерживают uintptr_t.
intptr_t
uintptr_t
char *