C++中的字符串和指针

String and pointer in C++

本文关键字:指针 字符串 C++      更新时间:2023-10-16

下面是我想知道附带注释中两个问题的答案的代码。请帮我

#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!
}

*(p++)给出'h',因为您首先询问值,然后在最后一行增加指针的位置。

  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"
    

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

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字符''。这是一个不可打印的字符,当你看到这个输出时,你看不到任何输出,可能是因为软件决定不打印不可打印文件。例如,如果您查看输出的十六进制转储,您可以在o:之后看到NUL

00000000  48 48 65 6c 6c 6f 00                              |HHello.|

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

执行p++实际上是请求值,然后递增。如果您想递增它,然后获得递增的值,请使用++p

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

第一个*(p++)给出"H",因为++运算符被定义为先给出其当前值,然后进行增量。最后的*(p++)返回字符'',因为字符串文字"Hello"指向一个SIX个字符的数组,其中最后一个是''

这是因为当使用后增量(例如p++)时,值在执行增量之前被求值

因此,在您的代码中,第一个cout << *(p++);将打印"H",因为它将在赋值之前评估p的值,即p的地址,然后p的值递增。

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

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

int main()
{
    char *p="Hello";
    cout <<*p;     //gives H
    cout <<*(++p); //this time it will give e
    cout <<*(++p); //gives l.
    cout <<*(++p); //gives l.
    cout <<*(++p); //gives o.
    cout <<*(++p); //gives no output since the character after a string is always  (credit to answer below)
}

希望这能有所帮助=D

这样做:

{
    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++推送堆栈上的值,增加指针,然后弹出堆栈返回。它也可能使用寄存器;实现细节在某种程度上取决于编译器。

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样式字符串中都有一个填充