在不同实例中,十六进制值通过字符指针使用不同的填充进行打印

Hex values printing with different padding through char pointer in different instances

本文关键字:填充 打印 指针 实例 十六进制 字符      更新时间:2023-10-16
#include<stdio.h>
int main()
{
    unsigned int a=0xabcdef12;
    char *c=(char *)&a;
    int i;
    for(i=0;i<4;i++)
    {
        printf("%x.....%xn",*c,c);
        c++;
    }
    return 0;
}

操作/点:

12.....bfad5bd4
ffffffef.....bfad5bd5
ffffffcd.....bfad5bd6
ffffffab.....bfad5bd7

如果您在第一次打印时看到,它正在打印 12,但在所有后续打印中,它打印了正确的值,但填充了 fffff。有人可以解释这种差异吗?

你在弄乱指针。在外面要小心。该行

char *bit_longer_name=(char *)&a;

说"gimme指向CHAR类型数据数组的指针,并称之为'bit_longer_name'。数组在变量'a'地址处初始化"。现在当你这样做时

bit_longer_name++

它实际上在内存中向前移动指针 - 转到数组中的下一个元素 - 就像my_char_array[i]所做的那样。您那里的打印:

printf("%x.....%xn",*c,c);

第一部分打印"我指向的当前数组单元格的值",您实际上正在为 printf 传递无效值(您应该从中得到警告!(,这会导致编译器从"c"指向的内存点读取(->它首先工作(。

另一方面,第二部分是"我用'c'指向的地址",正如你所看到的,它向前移动。