我有一个关于使用intptr_t
vs.的问题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 给了我关于类型转换的警告:“从指针转换为不同大小的整数。”
经过一些谷歌搜索和搜索(后者是一个词吗?),我看到有人推荐使用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
?现在我考虑了一下,我想如果你有 > 4GB 的 RAM,这是可能的,在这种情况下,内存地址可能超过 2^32 - 1(无符号长整数的最大值......)但 C 早在那之前就被创建了可以想象,对吧?还是他们有那么有先见之明?
谢谢!