请解释下面printfs的区别

Please explain the difference in the printfs below

printf("%x\n",(const uint8_t *)0x0D);
printf("%x\n",(const uint8_t)0x0D);
printf("%x\n",(uint8_t *)0x0D);
printf("%x\n",0x0D);

他们都给我D。这里的const*有什么意义?

%x 格式说明符专家参数类型为 unsigned int.

在你的情况下,

 printf("%x\n",(const uint8_t)0x0D);
 printf("%x\n",0x0D);

参数将被提升(默认提升规则)以匹配类型,但在

的情况下
 printf("%x\n",(const uint8_t *)0x0D);  //supplying a pointer
 printf("%x\n",(uint8_t *)0x0D);        //supplying a pointer

您将根据 C11 章节 §7.21.6.1

调用 undefined behavior

[...] If any argument is not the correct type for the corresponding conversion specification, the behavior is undefined. [...]

%x 指定 printf 用于将无符号整数参数打印为十六进制表示法。这就是为什么你看到所有打印 'D'。但是只有第4种形式是正确的。

printf("%x\n",(const uint8_t *)0x0D); // undefined behavior, converting integer constant to a pointer
printf("%x\n",(const uint8_t)0x0D);  // ok, but not necessary
printf("%x\n",(uint8_t *)0x0D); // undefined behavior
printf("%x\n",0x0D); // ok

注意该函数在任何情况下都不需要常量,所以 const 根本没用,注意 C 中的 const 不会生成常量,它只将某些东西定义为只读。