Почему / когда использовать `intptr_t` для приведения типов в C?

У меня есть вопрос относительно использования intptr_t по сравнению с long int . Я заметил, что увеличение адресов памяти (например, с помощью ручной арифметики указателя) зависит от типа данных. Например, увеличение указателя char добавляет 1 к адресу памяти, тогда как увеличение указателя int добавляет 4, 8 для двойного, 16 для длинного двойного и т. Д.

Сначала я сделал что-то вроде этого:

char myChar, *pChar;
float myFloat, *pFloat;

pChar = &myChar;
pFloat = &myFloat;

printf( "pChar:  %d\n", ( int )pChar );
printf( "pFloat: %d\n", ( int )pFloat );

pChar++;
pFloat++;

printf( "and then after incrementing,:\n\n" );
printf( "pChar:  %d\n", (int)pChar );
printf( "pFloat:    %d\n", (int)pFloat );

который компилировался и выполнялся просто отлично, но XCode предупреждал меня о приведении типов: «Преобразование указателя в целое число разного размера».

После нескольких поисков в Google (последнее слово еще не сказано?) я увидел, что некоторые люди рекомендуют используя intptr_t :

#include <stdint.h>

...

printf( "pChar:  %ld\n", ( intptr_t )pChar );
printf( "pFloat: %ld\n", ( intptr_t )pFloat );

, который действительно устраняет ошибки. Итак, я подумал, что с этого момента мне следует использовать intptr_t для указателей приведения типов ... Но затем, после некоторого беспокойства, я обнаружил, что могу решить проблему, просто заменив int на long int :

printf( "pChar:  %ld\n", ( long int )pChar );
printf( "pFloat: %ld\n", ( long int )pFloat );

Итак, мой вопрос: почему intptr_t полезен и когда его следует использовать? В данном случае это кажется лишним. Ясно, что адреса памяти для myChar и myFloat были слишком велики, чтобы поместиться в int ... поэтому присвоение им типа long int s решил проблему.

Неужели иногда адреса памяти слишком велики и для long int ? Теперь, когда я думаю об этом, я думаю, что это возможно, если у вас> 4 ГБ ОЗУ, и в этом случае адреса памяти могут превышать 2 ^ 32-1 (максимальное значение для длинных целых чисел без знака ...), но C был создан задолго до того, как это было можно вообразить, правда? Или они были такими дальновидными?

Спасибо!

43
задан grisaitis 21 April 2016 в 16:28
поделиться