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我不知道这件事!