为什么/何时使用`intptr
我有一个关于使用intptr_t
与long int
。 我发现递增内存地址(例如通过手动指针算术)因数据类型而异。 举个例子,增加一个字符指针会在内存地址中加1,而增加一个int指针则会增加4,8为一个双精度值,16为一个长精度等等。
起初我做了这样的事情:
char myChar, *pChar;
float myFloat, *pFloat;
pChar = &myChar;
pFloat = &myFloat;
printf( "pChar: %dn", ( int )pChar );
printf( "pFloat: %dn", ( int )pFloat );
pChar++;
pFloat++;
printf( "and then after incrementing,:nn" );
printf( "pChar: %dn", (int)pChar );
printf( "pFloat: %dn", (int)pFloat );
它编译和执行得很好,但XCode给了我类型警告:“从指针转换为不同大小的整数。”
经过一些谷歌搜索和binging(后者是一个字吗?),我看到一些人推荐使用intptr_t
:
#include <stdint.h>
...
printf( "pChar: %ldn", ( intptr_t )pChar );
printf( "pFloat: %ldn", ( intptr_t )pFloat );
这确实可以解决这些错误。 所以,我认为,从现在开始,我应该使用intptr_t
来进行类型转换指针...但是在经过一番激烈的讨论之后,我发现我可以通过用long int
替换int
来解决问题:
printf( "pChar: %ldn", ( long int )pChar );
printf( "pFloat: %ldn", ( long int )pFloat );
所以我的问题是,为什么intptr_t
有用,它应该在什么时候使用? 在这种情况下,这似乎是多余的。 显然, myChar
和myFloat
的内存地址太大,无法放入int
...因此,将它们设置为long int
解决问题。
是不是有时候内存地址是太大了, long int
呢? 现在我想到了,如果你的内存大于4GB,这种情况下内存地址可能会超过2 ^ 32 - 1(无符号长整型的最大值...),但是C之前很久以前就已经创建了想象,对吗? 还是他们有先见之明?
谢谢!
这是事情:在一些平台上, int
是合适的大小,但在其他平台上, long
是合适的大小。 你怎么知道你应该使用哪一个? 你没有。 有人可能是对的,但标准并不保证它会是哪一个(如果是的话)。 所以这个标准提供了一个被定义为正确大小的类型,而不管你在哪个平台上。 之前你必须写的地方:
#ifdef PLATFORM_A
typedef long intptr;
#else
typedef int intptr;
#endif
现在你只写:
#include <stdint.h>
它涵盖了更多的案例。 想象一下专门为您的代码运行的每个平台上面的代码片段。
intptr_t
是一个新发明,创建于64位甚至128位内存地址之后。
如果你需要转换的指针到一个整数类型, 总是使用intptr_t
。 做任何事情都会给将来需要移植代码的人带来不必要的问题。
在Mozilla / Firefox等程序中,当人们想要在64位Linux上进行编译时,需要花费很长时间才能解决所有的错误。
首先, intptr_t
仅用于数据指针(不是函数),并不保证存在。
那么,不,你不应该用它来打印。 %p
是为了这个。 你只需要将你的指针指向(void*)
然后你就可以继续。
算术/访问单个字节也不好。 而是转换为(unsigned char*)
。
intptr_t
确实是在极少数情况下必须将指针解释为整数(它们实际上不是)。 不,如果你不这样做。
上一篇: Why / when to use `intptr
下一篇: t instead of void*?