C ++中的字符串和指针

时间:2013-07-25 06:13:34

标签: c++

以下是我想知道旁边评论中2个问题的答案的代码。请帮帮我

#include<iostream>

using namespace std;

int main()
{
    char *p="Hello";
    cout <<*p;     //gives H
    cout <<*(p++); //also gives H.Why?
    cout <<*(p++); //gives e.
    cout <<*(p++); //gives l.
    cout <<*(p++); //gives l.
    cout <<*(p++); //gives o.
    cout <<*(p++); //gives no output.Why? It should give some garbage value!
}

8 个答案:

答案 0 :(得分:4)

*(p++)给出'h',因为你首先询问值而不是增加指针的位置,并在最后一行中显示相同的内容。

答案 1 :(得分:4)

  1. 如果您在代码中的任何位置使用p++,请说:

    <some code> p++ <some code>
    

    相当于

    <some code> p <some code>;
    p = p + 1;
    

    相反,如果你写:

    <some code> ++p <some code>
    

    相当于

    p = p + 1;
    <some code> p <some code>
    

    这应该回答你的第一个问题。

  2. C风格的字符串自动以\ 0字符结尾。所以如果你宣布:

    char *p="Hello";
    

    编译器会自动为该字符串的末尾添加\ 0(否则函数就像printf一样,当字符串结束时)。所以你的字符串实际上是:

    "Hello\0"
    

    如果你试图进一步推动指针,你将最终进入无效的内存,你可能会遇到任何事情(垃圾,也可能是一系列零)

答案 2 :(得分:3)

执行p++实际请求该值,然后递增它。如果您想增加它然后增加值,请使用++p

对于您的上一个问题,C字符串的最后一个值始终为'\0'。在大多数情况下,终端上没有打印任何内容,但这是C ++标准的未定义行为。

答案 3 :(得分:3)

p ++的作用是递增p并返回p的旧值,因此*(p ++)将始终返回存储在* p的字符,并且在语句* p将指向下一个字符之后。

cout <<*(p++); //gives 0.

这实际上不会给0,它会给出字符“o”,即Hello中的最后一个字符。

cout <<*(p++); //gives no output.Why? It should give some garbage value!

这将输出终止字符串的NUL字符'\0'。这是一个不可打印的角色,你看到这个输出你看不到任何可能因为软件决定不打印非printables。例如,如果你查看输出的十六进制转储,你可以在o:

之后看到NUL
00000000  48 48 65 6c 6c 6f 00                              |HHello.|

如果您添加了另一个cout <<*(p++)可能会看到垃圾输出,或者程序可能会崩溃,或者其他可能会发生,因为它将是“未定义的行为”。

答案 4 :(得分:1)

第一个*(p++)给出“H”,因为++运算符被定义为首先给出它的当前值,然后执行增量。最终*(p++)返回字符'\0',因为字符串文字"Hello"指向一个SIX字符数组,最后一个字符为'\0'

答案 5 :(得分:1)

这是因为在使用后增量(例如p++)时,在>增量完成之前评估值

因此,在您的代码中,您的第一个cout << *(p++);将打印“H”,因为它会在分配之前评估p 的值,这是{{的地址1}},然后p的值递增。

要在评估之前增加p的值,请使用预增量p

这就是你的代码中会发生的事情:

++p

希望这有帮助! = d

答案 6 :(得分:0)

这样做:

{
    char *p="Hello";
    cout <<*p;     //gives H.
    cout <<*(++p); //gives e.
    cout <<*(++p); //gives l.
    cout <<*(++p); //gives l.
    cout <<*(++p); //gives o.
    cout <<*(++p); //gives 0.
    cout <<*(++p); //will either be a garbage value or throw an exception
}

++ p将递增指针,然后返回值。 p ++将值压入堆栈,递增指针,然后弹出堆栈以返回它。它也可能使用寄存器;实现细节是由编译器决定的。

答案 7 :(得分:0)

char *p="Hello";
cout <<*p;     //gives H
cout <<*(p++); //also gives H.Why?

因为评估后后增量会增加p。 要在评估之前增加p,请使用*(++p)

cout <<*(p++); //gives e.
cout <<*(p++); //gives l.
cout <<*(p++); //gives l.
cout <<*(p++); //gives 0.
cout <<*(p++); //gives no output.Why? It should give some garbage value!

每个C风格的字符串都有一个填充\0