Ответ 1
Это в основном стилистический аргумент (оптимизирующий компилятор, вероятно, сгенерировал бы тот же или очень похожий код). Однако сравнение указателей может быть непростой задачей.
Помните, что в сравнении с чисто стандартным C-указателем сравнение имеет смысл только для указателей на одни и те же совокупные данные. Вероятно, вам не разрешено сравнивать два результата с malloc
, например. для сохранения отсортированного массива указателей.
Я бы сохранил их как void*
, а также как uintptr_t
. Подписанный intptr_t
имеет неудобство для разделения отрицательных и положительных чисел, и где они исходят из значительных указателей на приложения, это, вероятно, не приветствуется.
Обратите внимание, что a void*
не может быть разыменован: как uintptr_t
, вы должны указать его, чтобы сделать что-то полезное с данными, указанными по адресу; однако указатели void*
могут быть переданы таким подпрограммам, как memset
PS. Я предполагаю обычный процессор (например, некоторые x86, PowerPC, ARM,...) с плоским виртуальным адресным пространством. Вы могли бы найти экзотические процессоры - возможно, некоторые DSP - с очень значительными различиями (и, возможно, на которых intptr_t
не всегда имеет значение, помните, что в 1990-е годы Cray Y- MP суперкомпьютеров sizeof(long*) != sizeof(char*)
; в то время C99 не существовало, и я не уверен, что его <stdint.h>
может быть значимые на таких машинах)