Что такое intptr_t, это тип для целого или указателя?

Он определен в /usr/include/stdint.h:

typedef long int                intptr_t;

должен ли он быть типом для целого или указателя?

Ответ 1

Это целочисленный тип со знаком, который достаточно велик, чтобы удерживать указатель.

Ответ 2

Это целочисленный тип со знаком, который может содержать тип void*.

И почему существует также [u]intptr_t? Потому что:

Любой действительный указатель на void может быть преобразован в intptr_t или uintptr_tи обратно без изменения стоимости. Стандарт C гарантирует, что указатель на void может быть преобразован в или из указатель на любой тип объекта и обратно и что результат должен сравните с исходным указателем. Следовательно, преобразование непосредственно от указателя char * до uintptr_t разрешено для реализаций, поддерживающих uintptr_t.