我对这个程序感到困惑。
#include <stdio.h>
int main(void)
{
char* ptr="MET ADSD";
*ptr++;
printf("%c\n", ptr);
ptr++;
printf("%c\n", ptr);
}
这是输出。
ET ADSD
T ADSD
我的问题是指针如何显示其余字符?
答案 0 :(得分:4)
您实际上尝试打印为char %c
指针值char*
。这是错误的。但是,我真的不明白为什么它打印所有的字符。您确定没有使用%s
代替%c
吗?
答案 1 :(得分:4)
您将错误的参数组合传递给printf
:%c
格式规范需要char
参数,而不是char*
。所以结果是未定义的 - 在你的情况下printf
似乎打印整个char数组,但这只是纯粹的机会。使用
printf("%c\n", *ptr);
或
printf("%s\n", ptr);
答案 2 :(得分:3)
*运算符优先于++运算符。因此,在您的示例中,两行
*ptr++;
ptr++;
具有相同的效果。
你在printf语句中使用了错误的类型。
更改
printf("%c\n", ptr);
到
printf("%s\n", ptr);
或
printf("%c\n", *ptr);
取决于您想要输出的内容。
顺便说一句,在这种情况下启用编译器警告会有所帮助。例如。 GCC打印:
d.c: In function ‘main’:
d.c:7: warning: value computed is not used
d.c:8: warning: format ‘%c’ expects type ‘int’, but argument 2 has type ‘char *’
d.c:11: warning: format ‘%c’ expects type ‘int’, but argument 2 has type ‘char *’
d.c:12: warning: control reaches end of non-void function
答案 3 :(得分:2)
在C中,字符串是的字符数组,而数组只是指向数组内存的第一个位置的指针。 所以定义
char* ptr="MET ADSD";
你通过使用指向char的指针来声明和初始化一个字符数组,一个字符串,
如果考虑这两个因素,下一个技巧会出现:
++
会增加其值,即指向它的内存地址所以你要沿着两个位置缩放数组,然后使用%s
并将指针传递给它来打印它
编辑我猜您错误地将%c放在示例中
答案 4 :(得分:1)
如果你期望'E'为第一,'T'为第二输出。给它像
#include <stdio.h>
int main(void)
{
char* ptr="MET ADSD";
*ptr++;
printf("%c\n", *ptr);
ptr++;
printf("%c\n", *ptr);
}
答案 5 :(得分:1)
printf(...,ptr)正在传递指针,而不是它指向的char。 该程序的正确版本将是:
#include <stdio.h>
int main(int argc, char* argv[])
{
const char* ptr = "MET ADSD";
ptr++;
printf("%c\n", *ptr);
ptr++;
printf("%c\n", *ptr);
return 0;
}
将打印
E
T
除非您使用%s,否则您看到的输出毫无意义。 - %c将ptr的值转换为整数,将int截断为8位(char的宽度),并将该字符打印到输出。不是一串字符。