C 指针和投射

C 指针和投射,c,pointers,C,Pointers,让我们以下面的示例代码为例: #include <stdio.h> int main(void){ int x = 1; if(*(char *)&x == 1) printf("little-endian\n"); else printf("big-endian\n"); return 0; } #包括 内部主(空){ int x=1; 如果(*(char*)&x==1)printf(“小端点”\n); else printf(“big-

让我们以下面的示例代码为例:

#include <stdio.h>

int main(void){
    int x = 1;
    if(*(char *)&x == 1) printf("little-endian\n");
    else printf("big-endian\n");
    return 0;
}
#包括
内部主(空){
int x=1;
如果(*(char*)&x==1)printf(“小端点”\n);
else printf(“big-endian\n”);
返回0;
}
我已经多次看到这个(或类似的)指令
*(char*)&x
,现在我想完全理解它的含义
我想它的意思是:
1) 取整数变量的地址
2) 然后将其转换为字符指针
3) 然后将“新字符指针”的第一个元素与数字1进行比较。

我说得对吗?

你说得对,但更好的清单是:

  • x的地址
  • 将地址转换为指向字符的指针
  • 取消引用该指针,即读取
    &x
  • 将字符值与整数进行比较
    1

  • 请注意,这是一个相当尖锐的代码,读取值将取决于机器的字节结束度。

    在代码段上备注:打印的字符串不一定正确。仅仅因为第一个字节是最不重要的,并不一定意味着系统是小端(尽管我认为不存在任何反例)。仅仅因为第一个字节不是最不重要的,并不一定意味着系统是big-endian(并且确实存在反例,)。当然,所有这些都与演员的意义无关。好吧,谢谢,我明白了:)这也是一种判断持久性的糟糕方法;如果你真的,真的,真的需要关心的话,操作系统应该提供头文件来告诉你编译的是哪一个endianness;IIRC,在Linux上谢谢:D我不知道这件事!