C指针上的位移位?

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_tuintptr_t类型,应该是大到足以容纳你的系统上的指针,但都是整数,所以你可以做位操作.如果你正在寻找的话,它实际上并不是那么便携.


Tod*_*lin 8

如果你需要做这样的操作的指针上,你可以将它们转换成intptr_tuintptr_t,这两者可以发现stdint.h.这些保证被​​定义为特定于平台的整数类型,其中有足够的位来保存指针.

ptrdiff_t如果你需要一些东西来保持两个指针之间的区别,那里也有.

  • 如果您的编译器不支持stdint.h(*cough*Microsoft*cough*),则以下SO答案和注释会链接到您可能决定使用的几个:http://stackoverflow.com/questions/126279/c99 -stdint-H-集管和MS-视觉工作室/ 126285#126285 (4认同)