指针和类型转换

7

让我们来看这段示例代码:

#include <stdio.h>

int main(void){
    int x = 1;
    if(*(char *)&x == 1) printf("little-endian\n");
    else printf("big-endian\n");
    return 0;
}

我之前多次看到过这个(或类似的)指令*(char *)&x,现在我想完全理解它的含义!
我认为它的意思是:
1) 取int变量的地址
2) 然后将其强制转换为char指针
3) 然后比较“新char指针”的第一个元素与数字1。

我的理解正确吗?


4
代码片段的注释:打印的字符串不一定是正确的。仅因为第一个字节是最低位并不意味着系统一定是小端序(虽然我认为不存在任何反例)。同样,仅因为第一个字节不是最低位并不意味着系统一定是大端序(实际上存在反例,https://en.wikipedia.org/wiki/Endianness#Middle-endian)。当然,这些都与类型转换的含义无关。 - Steve Jessop
2
这也是一种不好的确定字节序的方式;如果你真的、真的、真的需要关心,操作系统应该提供头文件告诉你正在编译的字节序;我记得在Linux上是<sys/endian.h>。 - tbert
1个回答

5
你说得差不多了,但更好的清单应该是:
  1. 取得 x 的地址
  2. 将地址转换为字符指针
  3. 解引用该指针,即读取在 &x 处的第一个 char
  4. 将字符值与整数 1 进行比较
请注意,这是非常冒险的代码,读取的值将取决于机器的字节顺序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接