MAD*_*ood 9 c pointers bitwise-operators
我正处于这个C项目的中间,我希望能够提高内存效率.在几种情况下,我使用我写的动态数组结构的void*s来保存位.我希望使用所有64位(在这种情况下)位.
我很快意识到你实际上无法对指针进行任何操作.所以我的解决方案如下:
void *p;
((unsigned long)p) << 4;
((unsigned long)p) & 3;
Run Code Online (Sandbox Code Playgroud)
这可以完成工作,但仅仅因为在我的计算机上,long和指针的大小相等.在所有(或大多数)架构中都会出现这种情况吗?
而我真正的问题是:是否有更正确的方法对指针进行位操作? 我曾经认为这种方法在C中有点常见(将位打包成空格*),但我可能会弄错...
Chr*_*utz 16
如果你的编译器支持它,C99的<stdint.h>头提供了intptr_t和uintptr_t类型,应该是大到足以容纳你的系统上的指针,但都是整数,所以你可以做位操作.如果你正在寻找的话,它实际上并不是那么便携.
如果你需要做这样的操作的指针上,你可以将它们转换成intptr_t和uintptr_t,这两者可以发现stdint.h.这些保证被定义为特定于平台的整数类型,其中有足够的位来保存指针.
ptrdiff_t如果你需要一些东西来保持两个指针之间的区别,那里也有.