我正处于这个C项目的中间,我希望能够提高内存效率。在几种情况下,我使用我写的动态数组结构的void * s来保存位。我希望使用全部64位(在这种情况下)位。
我很快就意识到你实际上无法对指针进行任何操作。所以我的解决方案如下:
void *p;
((unsigned long)p) << 4;
((unsigned long)p) & 3;
这可以完成工作,但只是因为在我的计算机上,long和指针的大小相等。在所有(或大多数)架构中都会出现这种情况吗?
我真正的问题:是否有更正确的方法对指针进行位操作?我曾认为这种方法在C中有点常见(将位打包成空格*),但是我错了......
答案 0 :(得分:16)
如果您的编译器支持它,C99的<stdint.h>
标头提供了intptr_t
和uintptr_t
类型,它们应该足够大以在系统上保存指针,但是是整数,所以你可以做点操作。如果那就是你正在寻找的东西,它实际上不可能比那更容易携带。
答案 1 :(得分:8)
如果你需要对指针进行这种操作,可以将它们转换为intptr_t
和uintptr_t
,这两种操作都可以在stdint.h
中找到。这些保证被定义为特定于平台的整数类型,其中有足够的位来保存指针。
如果你需要一些东西来控制两个指针之间的区别,那里还有ptrdiff_t
。
答案 2 :(得分:3)
我认为你正试图解决错误的问题。真正的问题就在这里:
我正在使用动态的void * s 我写的数组结构是为了 持有位。
不要使用void指针来保存位。使用void指针来保存指针。使用无符号整数来保存位。
答案 3 :(得分:2)
声明指针和位域的并集。