指针和字符数组

时间:2014-11-28 10:36:11

标签: c pointers

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'的第一个字符的内存地址,我试图将该值打印为字符?

5 个答案:

答案 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之间产生不同的打印输出