C指针上的位移位?

时间:2009-12-04 06:18:45

标签: c pointers bitwise-operators

我正处于这个C项目的中间,我希望能够提高内存效率。在几种情况下,我使用我写的动态数组结构的void * s来保存位。我希望使用全部64位(在这种情况下)位。

我很快就意识到你实际上无法对指针进行任何操作。所以我的解决方案如下:

void *p;
((unsigned long)p) << 4;
((unsigned long)p) & 3;

这可以完成工作,但只是因为在我的计算机上,long和指针的大小相等。在所有(或大多数)架构中都会出现这种情况吗?

我真正的问题:是否有更正确的方法对指针进行位操作?我曾认为这种方法在C中有点常见(将位打包成空格*),但是我错了......

4 个答案:

答案 0 :(得分:16)

如果您的编译器支持它,C99的<stdint.h>标头提供了intptr_tuintptr_t类型,它们应该足够大以在系统上保存指针,但是是整数,所以你可以做点操作。如果那就是你正在寻找的东西,它实际上不可能比那更容易携带。

答案 1 :(得分:8)

如果你需要对指针进行这种操作,可以将它们转换为intptr_tuintptr_t,这两种操作都可以在stdint.h中找到。这些保证被​​定义为特定于平台的整数类型,其中有足够的位来保存指针。

如果你需要一些东西来控制两个指针之间的区别,那里还有ptrdiff_t

答案 2 :(得分:3)

我认为你正试图解决错误的问题。真正的问题就在这里:

  

我正在使用动态的void * s   我写的数组结构是为了   持有位。

不要使用void指针来保存位。使用void指针来保存指针。使用无符号整数来保存位。

答案 3 :(得分:2)

声明指针和位域的并集。