键入cast char指向整数指针的指针

所以我看到了一些关于如何找到架构的字节序的例子。 假设我们有一个指向int数据类型的整数指针。 让我们说int值是0x010A0B12。 在小端架构中,最低有效字节(即12)将存储在最低内存地址中,对吧? 因此,4字节整数中的最低字节为12。

现在,检查。 如果我们声明一个char指针p,并输入将整数指针转换为char *并将其存储在p中,并打印取消引用的p值,我们将得到一个关于该结构的字节顺序的线索。 如果它是12,我们就是小尾数; 01表示大端。 听起来真的很整洁……

int a = 0x010A0B12; int *i = &a; char *p = (char*)i; printf("%d",*p); // prints the decimal equivalent of 12h! 

这里有几个问题,真的。 由于指针是强类型的,字符指针不应该严格指向char数据类型吗? 用%d打印的是什么? 难道我们不应该用%c打印字符吗?

由于指针是强类型的,字符指针不应该严格指向char数据类型吗?

C有一个规则,任何指针都可以安全地转换为char*void* 。 因此,允许将int*转换为char* ,并且它也是可移植的。 指针将指向int内部表示的初始字节。

难道我们不应该用%c打印字符吗?

另一件事就是在这里: printf可变长度参数列表。 将char传递给printf的无类型参数时,默认转换适用: char转换为int 。 这就是为什么%d format可以正常使用,并按照您的预期打印出来。

你也可以使用%c 。 处理%c说明符的代码将参数作为int读取,然后将其转换为char 。 但是, 0x12是一个特殊字符,因此您不会看到统一的打印输出。

由于指针是强类型的,字符指针不应该严格指向char数据类型吗?

这是一种未定义的行为 – 但是大多数理智的实现都会按照你的意思行事。 所以大多数人都会说好。

用%d打印的是什么?

格式%d需要int类型的参数,并且通常的C规则将char类型的实际arg提升为int。 所以这又好了。 您可能不想使用%c,因为p指向的字节内容可能是任何字节,并不总是有效的文本字符。