将 char 指针类型转换为整数指针
Type casting char pointer to integer pointer
所以我看到了一些关于如何找到体系结构字节顺序的示例。假设我们有一个指向 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
,然后将其转换为 char
。 0x12
是一个特殊字符,因此您不会看到它的统一打印输出。
Since pointers are strongly typed, shouldn't a character pointer strictly point to a char data type?
这是一种未定义的行为 - 但大多数理智的实现都会按照您的意思进行。所以大多数人都会同意。
And what's up with printing with %d?
格式 %d 需要 int 类型的参数,而实际的 char 类型参数被通常的 C 规则提升为 int。所以这又可以了。您可能不想使用 %c,因为 p 指向的字节内容可能是任何字节,并不总是有效的文本字符。
所以我看到了一些关于如何找到体系结构字节顺序的示例。假设我们有一个指向 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
,然后将其转换为 char
。 0x12
是一个特殊字符,因此您不会看到它的统一打印输出。
Since pointers are strongly typed, shouldn't a character pointer strictly point to a char data type?
这是一种未定义的行为 - 但大多数理智的实现都会按照您的意思进行。所以大多数人都会同意。
And what's up with printing with %d?
格式 %d 需要 int 类型的参数,而实际的 char 类型参数被通常的 C 规则提升为 int。所以这又可以了。您可能不想使用 %c,因为 p 指向的字节内容可能是任何字节,并不总是有效的文本字符。