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

时间:2016-02-19 02:00:45

标签: c pointers casting endianness

所以我看到了一些关于如何找到架构的字节顺序的例子。我们假设我们有一个指向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打印字符吗?

2 个答案:

答案 0 :(得分:6)

  

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

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

  

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

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

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

答案 1 :(得分:-1)

  

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

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

  

用%d打印的是什么?

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