以下是我想知道旁边评论中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!
}
答案 0 :(得分:4)
*(p++)
给出'h'
,因为你首先询问值而不是增加指针的位置,并在最后一行中显示相同的内容。
答案 1 :(得分:4)
如果您在代码中的任何位置使用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\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:
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
。