我对这个程序感到困惑。关于char指针的问题
#include <stdio.h>
int main(void)
{
char* ptr="MET ADSD";
*ptr++;
printf("%c\n", ptr);
ptr++;
printf("%c\n", ptr);
}
这是输出。
ET ADSD
牛逼ADSD
我的问题是如何做的指针显示字符的休息吗?
我对这个程序感到困惑。关于char指针的问题
#include <stdio.h>
int main(void)
{
char* ptr="MET ADSD";
*ptr++;
printf("%c\n", ptr);
ptr++;
printf("%c\n", ptr);
}
这是输出。
ET ADSD
牛逼ADSD
我的问题是如何做的指针显示字符的休息吗?
您将参数的错误组合传递给printf
:%c
格式规范需要char
参数,而不是char*
。所以结果是不确定的 - 你的情况printf
似乎打印整个字符数组,但这只是纯粹的机会。使用任一
printf("%c\n", *ptr);
或
printf("%s\n", ptr);
+1。如果你在严格设置下编译,编译器会警告你。例如'gcc -ansi -pedantic -W -Wall
如果您预期'E'为第一输出,'T'为第二输出。像
#include <stdio.h>
int main(void)
{
char* ptr="MET ADSD";
*ptr++;
printf("%c\n", *ptr);
ptr++;
printf("%c\n", *ptr);
}
所以你的意思是说%s把字符数组看作一个字符串? – Searock 2010-08-30 10:10:26
@Searock:它确实存在,但是你需要取消引用指针('* ptr')来获取指向的字符。 – 2010-08-30 10:12:27
@Searock正好,但即使我不明白为什么它打印整个字符串%c,它应该打印字符。等于地址,即如果ptr = 1057,则(char)1057 – 2010-08-30 10:49:40
*运算符优先于++运算符。因此在你的例子中,两条线
*ptr++;
ptr++;
具有相同的效果。
并且您在printf语句中使用了错误的类型。
变化
printf("%c\n", ptr);
到
printf("%s\n", ptr);
或
printf("%c\n", *ptr);
取决于你想要什么样的输出。
顺便说一句,打开编译器警告有助于在这种情况下。例如。海合会打印:
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
+1 - 用于写入警告。 – 2010-08-30 10:59:41
你实际上是试图打印的字符%c
的指针值char*
。这是错误的。但是,我真的不明白为什么它会打印所有的字符。你确定你没有使用%s
而不是%c
吗?
在C 串是阵列字符,以及一个阵列仅仅是一个指针阵列的存储器的第一单元。 所以定义,通过使用字符指针,
char* ptr="MET ADSD";
您声明并初始化字符,一个字符串数组
,如果你认为这两个因素的下招说到:
++
上的指针增加其值,它指向的内存地址所以你缩放沿着两个位置的阵列,和您打印使用%s
并传递指针,它
编辑我猜你会错误地将%c放入示例中
printf(...,ptr)正在传递指针,而不是它指向的字符。 程序的正确版本是:
#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的宽度),并将该字符打印到输出中。不是一串字符。
如注释所示,它看起来像* *不是您实际运行的C代码,因为您必须使用'%s'而不是'%c'。请注意确保您提交的示例与您运行的完全相同。 – 2010-08-30 10:14:24