关于char指针的问题

时间:2010-08-30 10:06:08

标签: c

我对这个程序感到困惑。

#include <stdio.h>

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

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

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

这是输出。

  

ET ADSD
  T ADSD

我的问题是指针如何显示其余字符?

6 个答案:

答案 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的指针来声明和初始化一个字符数组,一个字符串,

如果考虑这两个因素,下一个技巧会出现:

  • 指针算术,因为在指针上使用运算符++会增加其值,即指向它的内存地址
  • 字符大小,几乎到处都是1字节

所以你要沿着两个位置缩放数组,然后使用%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的宽度),并将该字符打印到输出。不是一串字符。