void *,字符串和字符的指针

时间:2018-03-01 15:17:30

标签: c pointers void-pointers

#include<stdio.h>
#include<conio.h>
void main() 
{
   char cr[] = "Yash";
   clrscr();
   printf("%p\n",(void*)cr);
   printf("%p\n",cr);
   printf("%p\n",&cr);
   printf("%p\n",&cr[0]);
   printf("%p\n",cr[0]);
   printf("%p\n",(void*)cr[0]);

   printf("%c\n",&cr[0]);
   printf("%s\n",&cr);
   printf("%c\n",(void*)cr[0]);
   printf("%s\n",(void*)cr);
   getch();
}

输出:

FFEE
FFEE
FFEE
FFEE
0059
0059
ε
Yash
Y
Yash

问题: 我无法完全理解我在此代码中得到的输出。有人可以解释每个输出为什么它是这样的。特别是为什么printf("%c",&cr[0]);给了ε这个奇怪的或者可能是空符号?  为什么(void*)cr[0]cr[0]的输出与%p的一半中的其他3的输出不同?如果他们只是地址那么为什么不同呢?(我真的很抱歉我做的最后一分钟改变:/)

1 个答案:

答案 0 :(得分:3)

  

解释每个输出

UB 未定义的行为任何都可能发生。 "%p"需要void*。指向字符的指针和void*具有相同的表示。

char cr[] = "Yash";
printf("%p\n",(void*)cr);     // OK:  address of CR[0]
printf("%p\n",cr);            // OK:  address of CR[0]  
printf("%p\n",&cr);           // UB,  &cr is neither a void * or pointer to a character
printf("%p\n",&cr[0]);        // OK:  address of CR[0]  
printf("%p\n",cr[0]);         // UB   cr[0] is neither a void * or pointer to a character
printf("%p\n",(void*)cr[0]);  // UB,  conversion to void* from arbitrary integer

"%s"期望char*到有效的字符串

printf("%s\n",&cr);           // UB,  Not a `char *`
printf("%s\n",(void*)cr);     // OK

"%c"需要int,将其转换为unsigned char并打印该字符。

printf("%c\n",&cr[0]);        // UB, pointer passed as int
printf("%c\n",(void*)cr[0]);  // UB, pointer passed as int
  

为什么printf("%s",&cr);会给......

printf("%s",&cr); - &gt; printf期望&cr成为指向字符串的有效指针。它不是。结果:未定义的行为 - 可能发生任何事情。

  

为什么(void *)cr [0]和cr [0]的输出与&#34;%p

的一半中的其他3的输出不同

printf("%p\n",(void*)cr[0]);printf("%p\n",cr[0]);是UB。

在UB发生时解释输出是没有效率的,直到有人清楚地理解为什么解释UB通常不是很有用。