c - 将 char 指针类型转换为整数指针

标签 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 打印字符吗?

最佳答案

Since pointers are strongly typed, shouldn't a character pointer strictly point to a char data type?

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

Shouldn't we rather print with %c, for character?

另一件事在这里发挥作用:printf 的可变长度参数列表。当您将 char 传递给 printf 的无类型参数时,将应用默认转换:char 转换为 int .这就是为什么 %d 格式可以很好地接受数字,并按照您的预期打印出来。

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

关于c - 将 char 指针类型转换为整数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35496014/

相关文章:

条件操作

java - 为什么 new String ("a") == new String ("a") 给出 false 并且 "a"= ="a"给出 true。为什么在后面的案例中它们似乎都被视为同一实例?

c - 指向自定义地址

c - 方程双指针指向 NULL 在 C 中给出段错误

c# - 使用Couchbase时发生类型转换错误

c - 在 for 循环中添加数字

c - 在 CodeVisionAVR 中使用定时器生成正弦波形

go - Go 中的函数类型 - 将特定类型转换为更通用的类型

lua - Swig 类型转换为派生类?

c - 面试题: C program to sort a binary array in O(n)