为什么/何时使用`intptr

我有一个关于使用intptr_tlong 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有用,它应该在什么时候使用? 在这种情况下,这似乎是多余的。 显然, myCharmyFloat的内存地址太大,无法放入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确实是在极少数情况下必须将指针解释为整数(它们实际上不是)。 不,如果你不这样做。

链接地址: http://www.djcxy.com/p/28373.html

上一篇: Why / when to use `intptr

下一篇: t instead of void*?