У меня вопрос по поводу использования intptr_t
против long int
. Я заметил, что увеличение адресов памяти (например, с помощью ручной арифметики указателей) отличается в зависимости от типа данных. Например, приращение указателя на символ добавляет 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 был создан задолго до того, как это было мыслимый, верно? Или они были такими предусмотрительными?
Спасибо!