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
和*
的重要性是什么?
答案 0 :(得分:1)
%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
,您将调用undefined behavior,章节§7.21.6.1
[...]如果有任何论据 不是相应转换规范的正确类型,行为是 未定义。 [...]
答案 1 :(得分:0)
%x
中指定的 printf
用于将无符号整数参数打印为十六进制表示法。这就是为什么你看到所有打印'D'。但只有第四种形式是正确的。
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
不会保持不变,它只将内容定义为只读。