C++中的字符串和指针
String and pointer in C++
下面是我想知道附带注释中两个问题的答案的代码。请帮我
#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'
,因为您首先询问值,然后在最后一行增加指针的位置。
-
如果您在代码中的任何位置使用
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>
这应该能回答你的第一个问题。
-
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样式字符串中都有一个填充