在C++中递增字符指针

5

为什么程序会出现

char *s, *p, c;

s = "abc";

printf(" Element 1 pointed to by S is '%c'\n", *s);
printf(" Element 2 pointed to by S is '%c'\n", *s+1);
printf(" Element 3 pointed to by S is '%c'\n", *s+2);
printf(" Element 4 pointed to by S is '%c'\n", *s+3);
printf(" Element 5 pointed to by S is '%c'\n", s[3]);
printf(" Element 4 pointed to by S is '%c'\n", *s+4);

给出以下结果?
 Element 1 pointed to by S is 'a'
 Element 2 pointed to by S is 'b'
 Element 3 pointed to by S is 'c'
 Element 4 pointed to by S is 'd'
 Element 5 pointed to by S is ' '
 Element 4 pointed to by S is 'e'

编译器是如何继续序列的?为什么s[3]返回一个空值?

5
优先级。您想要 *(s+1) 等,但 *(s+4) 将是未定义的行为。 - Daniel Fischer
s[3] 返回第四个字符(它们从0开始索引),这是一个字符串终止符\0 - Joachim Isaksson
s[3]\0,所以它不显示任何内容。 - bash.d
1
我对Element 5的输出持怀疑态度 - 引号之间不应该有空格。 - Mark Reed
顺便提一下,如果你在使用C++而不是纯C进行编码,请不要使用printfstd::cout(来自头文件<iostream>)更安全、更易于使用且更少出错。 - Violet Giraffe
2个回答

9
它不会继续序列。您正在执行*s+3,它首先对s进行解引用,以给您带来具有值'a'char,然后您将添加到该char值上。 将3添加到'a'会给您'd'的值(至少在您的执行字符集中)。
如果您将它们更改为*(s+1)等,则会得到预期的未定义行为。 s [3]访问字符串的最后一个元素,即空字符。

5
一条提示:常常使用 "abc" 作为测试字符串并不是一个好的选择,因为即使代码有错误,也很容易意外地得到期望的结果(或相似程度令人困惑的结果)。请注意避免这种情况。 - user180247

2

请注意*s是一个字符,本质上是一个数字。将另一个数字添加到它上面,会得到一个ASCII值更高的字符。 s[3]是空的,因为你只将"abc"分别赋值给了0、1、2号位置。事实上,第三个字符是'\0'字符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接