我有以下代码
int main()
{
int arr[3] = {2, 3};
char *p;
p = arr;
p = (char *)((int*)(p));
printf("%d, ", *p);
p++;
p = (int*)(p+1);
printf("%d", *p);
return 0;
}
o/p-2,0
但我想知道它是如何在第二个 printf 中打印 0 的,我知道所有关于 little-endian
的东西,就像在 4 字节整数
的内存中这些元素是如何存储,如下
00000010 00000000 0000000 00000000 00000011 00000000 00000000 00000000
因此,在第一个 printf
期间我们得到 2 作为答案,但在第二个 printf
期间指针位于 second byte
处,这是 0 但它现在是一个整数指针,但它是如何打印 0 的,因为它必须检查最多 4 个字节的内存然后它必须打印整个数据最多 4 个字节。
我认为将是 3,因为它将打印最多 4 个字节。
我想要的是整数数据是如何通过printf打印的,有人能告诉我吗
最佳答案
指针 p
的类型不会随着以下两者中的任何一个而改变:p = (char *)((int*)(p));
p = (int*)(p+1);
.
它仍然是指向 char
的指针。
强制转换仅适用于改变表达式中的值(或类型)。它适用于从变量中提取的值的副本,但不会修改这些变量。表达式结束后,强制转换连同它关联的值副本一起消失。
例子:
signed char c = -1;
int i;
i = (unsigned char)c;
此处 c
的值 -1 被转换/强制转换为 unsigned char
类型。如果 chars 是 8 位,(unsigned char)-1
的结果是 255,这个值是 unsigned char
类型,然后被转换为 int
并分配给 i
。
c
在上述过程中并没有发生任何变化。
示例 2:
unsigned u = 0x55AA;
unsigned* pu = &u;
unsigned char* pc = (unsigned char*)pu;
此处 pu
被转换/强制转换为指向 unsigned char
的类型指针。该转换不会修改变量 pu
,它只会更改其值的副本。在这里它只是改变了副本的类型,而不是指针变量中包含的实际地址。然后这个地址的副本被分配给pc
。需要强制转换以避免编译器警告/错误,因为编译器有权“想知道”这里发生了什么,以及是否可能存在编程错误。
现在 pu
和 pc
都指向同一个位置,即变量 u
的开头。但它们有不同的类型,一个指向 unsigned char
,另一个指向 unsigned int
。
因此,如果您取消引用 pu
和 pc
,您将获得不同的值,并且它们的类型也不同。
同样,如果你对两个指针进行指针运算,比如每一个都加1,它们会提前指向内存中的不同位置。 pu+1
将指向 u
结束后的位置,pc+1
将指向第二个 unsigned char
从 u
开始。
你开始看到了吗?
关于c - printf 函数如何处理整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12669164/