2010-08-30 59 views
1

我对这个程序感到困惑。关于char指针的问题

#include <stdio.h> 

int main(void) 
{ 
    char* ptr="MET ADSD"; 

    *ptr++; 
    printf("%c\n", ptr); 

    ptr++; 
    printf("%c\n", ptr); 
} 

这是输出。

ET ADSD
牛逼ADSD

我的问题是如何做的指针显示字符的休息吗?

+2

如注释所示,它看起来像* *不是您实际运行的C代码,因为您必须使用'%s'而不是'%c'。请注意确保您提交的示例与您运行的完全相同。 – 2010-08-30 10:14:24

回答

4

您将参数的错误组合传递给printf%c格式规范需要char参数,而不是char*。所以结果是不确定的 - 你的情况printf似乎打印整个字符数组,但这只是纯粹的机会。使用任一

printf("%c\n", *ptr); 

printf("%s\n", ptr); 
+3

+1。如果你在严格设置下编译,编译器会警告你。例如'gcc -ansi -pedantic -W -Wall -o ' – 2010-08-30 10:12:48

1

如果您预期'E'为第一输出,'T'为第二输出。像

#include <stdio.h> 

int main(void) 
{ 
    char* ptr="MET ADSD"; 

    *ptr++; 
    printf("%c\n", *ptr); 

    ptr++; 
    printf("%c\n", *ptr); 
} 
+0

所以你的意思是说%s把字符数组看作一个字符串? – Searock 2010-08-30 10:10:26

+0

@Searock:它确实存在,但是你需要取消引用指针('* ptr')来获取指向的字符。 – 2010-08-30 10:12:27

+0

@Searock正好,但即使我不明白为什么它打印整个字符串%c,它应该打印字符。等于地址,即如果ptr = 1057,则(char)1057 – 2010-08-30 10:49:40

3

*运算符优先于++运算符。因此在你的例子中,两条线

*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 
+0

+1 - 用于写入警告。 – 2010-08-30 10:59:41

4

你实际上是试图打印的字符%c的指针值char*。这是错误的。但是,我真的不明白为什么它会打印所有的字符。你确定你没有使用%s而不是%c吗?

2

在C 阵列字符,以及一个阵列仅仅是一个指针阵列的存储器的第一单元。 所以定义,通过使用字符指针,

char* ptr="MET ADSD"; 

您声明并初始化字符,一个字符串数组

,如果你认为这两个因素的下招说到:

  • 指针算术在使用运算符++上的指针增加其值,它指向的内存地址
  • 字符大小这几乎是无处不在1个字节

所以你缩放沿着两个位置的阵列,和您打印使用%s并传递指针,它

编辑我猜你会错误地将%c放入示例中

1

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的宽度),并将该字符打印到输出中。不是一串字符。