我有一个关于使用的问题intptr_t
vs. long int
。我观察到递增内存地址(例如通过手动指针算术)因数据类型而异。例如,递增 char 指针会向内存地址添加 1,而递增 int 指针会添加 4、8(对于 double)、16(对于 long double)等等……
起初我做了这样的事情:
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 给了我类型转换的警告:“从指针转换为不同大小的整数。”
经过一番谷歌搜索和搜索(后者是一个词吗?),我看到一些人推荐使用intptr_t
:
#include <stdint.h>
...
printf( "pChar: %ld\n", ( intptr_t )pChar );
printf( "pFloat: %ld\n", ( intptr_t )pFloat );
这确实解决了错误。所以,我想,从现在开始,我应该使用intptr_t
对于类型转换指针...但是经过一些坐立不安,我发现我可以通过替换来解决问题int
with long int
:
printf( "pChar: %ld\n", ( long int )pChar );
printf( "pFloat: %ld\n", ( long int )pFloat );
所以我的问题是,为什么intptr_t
有用,什么时候应该使用?在这种情况下,这似乎是多余的。显然,内存地址为myChar
and myFloat
太大了,装不下int
...所以将它们类型转换为long int
解决了问题。
Is it that sometimes memory addresses are too big for long int
as well? Now that I think about it, I guess that's possible if you have > 4GB of RAM, in which case memory addresses could exceed 232 - 1 (max value for unsigned long int
s...) but C was created long before that was imaginable, right? Or were they that prescient?
Thanks!