输出如何成为杰克?
#include <stdio.h>
int main()
{
void *vp;
char ch = 74, *cp = "JACK";
int j = 65;
vp = &ch;
printf("%c", *(char*)vp);
vp = &j;
printf("%c", *(int*)vp);
vp = cp;
printf("%s", (char*)vp + 2);
return 0;
}
答案 0 :(得分:1)
vp = &ch;
printf("%c", *(char*)vp);
使用代码74(J)输出字符
vp = &j;
printf("%c", *(int*)vp);
使用代码65(A)输出字符
vp = cp;
printf("%s", (char*)vp + 2);
输出字符串“JACK”,偏移量为2(CK)
=&GT; JACK
答案 1 :(得分:1)
printf("%c", *(char*)vp);
vp
指向包含char
的{{1}}地址'J'
printf("%c", *(int*)vp);
vp
指向包含65的int
的地址,该地址为'A'
printf("%s", (char*)vp + 2);
vp
指向"Jack"
。高级2时,会打印"CK"
答案 2 :(得分:1)
下面:
char ch=74
74是字符'J'
的十进制值,因此与
char ch='J'
下面:
int j=65;
65是字符'A'
的十进制值,因此与
int j='A';
所有这些都可以在the ASCII table中找到。
所以,
printf("%c", *(char*)vp);
将J
打印为vp
,此时指向ch
的地址,其中包含值74('J'
)并将其转换为{{1}并且取消引用它会得到74(char*
)。
类似地,
'J'
将printf("%c", *(int*)vp);
打印为A
,此时指向vp
的地址,其中包含值65(j
)并将其转换为{{1}并且取消引用它会给出65('A'
)。
最后,
int*
与
相同'A'
因为printf("%s", (char*)vp + 2);
指向printf("%s", cp + 2);
的第一个元素的地址。上面的vp
表示“打印从字符串的第三个字符开始的所有内容,直到NUL-terminator ”,这将打印cp
。