Hello Everyone我只想澄清对指针的疑问。所以我可以知道我是否理解它。
void main ()
{
char c[10]="COMPUTERS";
printf("The first is %d\n",c); //1
printf("The second is %f\n",c); //2
printf("The third is %u\n",c); //3
printf("The fourth is %s\n",c); //4
printf("The fifth is %c\n",c); //5
}
第一个printf将打印字符数组'c'的第一个位置的地址,
同样,第二个printf也会尝试以浮动形式打印地址。
第三个printf将再次打印地址。
第四个printf将打印字符数组。
我的疑问与第五版有关。它是打印随机值或有时没有值是因为'c'的值是数组'c'的第一个字符的内存地址,我试图将该值打印为字符?
答案 0 :(得分:1)
除了%s
之外,所有这些打印都是未定义的行为。您使用%c
格式说明符看到的奇怪行为是由于指针地址上的基础强制转换,可能会从运行一次到下一次转换。
如果你想打印地址,指针指向使用%p
,如下所示:
printf("address: %p\n", (void *)c);
答案 1 :(得分:1)
(这些不是"怀疑",或许它们是问题或不确定因素。)
除了%s
之外的所有内容都是未定义的行为,因为它们都与提供的值(char *
)的实际类型与格式化说明符不匹配。
答案 2 :(得分:0)
printf("The fifth is %c\n",c[0]);
这是有道理的。打印阵列的第一个字符。 试图像角色一样打印地址是没有意义的。
只有这个printf()
是好的
printf("The fourth is %s\n",c);
printf()'s
的其余部分有未定义的行为。
答案 3 :(得分:0)
第一个printf将打印字符数组第一个位置的地址' c',
严格地说,第一个printf将调用未定义的行为,因为您使用了错误的格式说明符来打印指针。但是,它会可能在大多数系统上打印地址。
同样,第二个printf也会尝试以浮动形式打印地址。
不,它只会给你一些二进制粘性物质。您永远不会将地址转换为浮动格式,您只会尝试打印它,就像它一样。这是完全未定义的行为。
第三个printf将再次打印地址。
与1.未定义的行为相同,但是,它可能会打印地址......
第四个printf将打印字符数组。
是
我的疑问与第五版有关。它打印随机值或有时没有值,因为' c'是数组的第一个字符的内存地址' c'我试图将该值打印为角色?
同样,未定义的行为。它可以打印任何东西。
答案 4 :(得分:0)
理论分析:
printf("The first is %d\n",c); // undefined behavior by the standard
printf("The second is %f\n",c); // undefined behavior by the standard
printf("The third is %u\n",c); // undefined behavior by the standard
printf("The fifth is %c\n",c); // undefined behavior by the standard
实践分析:
printf("The first is %d\n",c); // requires sizeof(void*) == sizeof(int)
printf("The second is %f\n",c); // requires sizeof(void*) == sizeof(double)
printf("The third is %u\n",c); // requires sizeof(void*) == sizeof(unsigned int)
printf("The fifth is %c\n",c); // different between big-endian and little-endian
详细的实际分析:
sizeof(void*) < sizeof(...)
可能会在运行时产生内存访问冲突sizeof(void*) > sizeof(...)
将在big-endian和little-endian之间产生不同的打印输出