字符串的差异

时间:2016-09-16 03:48:22

标签: c++

我坚持为什么*("Harry" + 2 )"Harry"[3]具有相同的输出(r),但"Harry" + 1输出为(arry)。有什么区别?

cout << "Harry" + 1 << endl;
cout << *("Harry" + 2 ) << endl;
cout << "Harry"[3] << endl;
cout << endl;

5 个答案:

答案 0 :(得分:3)

"Harry" + 1指向H之后的一个字符,所以现在字符串&#34;丢失&#34;一个角色,H

*("Harry" + 2)指向H后的2个字符,因此它指向第一个r。取消引用它只是单个字符,即r

"Harry"[3]获取"Harry"中的第三个字符,即第二个r。请注意,它是*("Harry" + 3)的语法糖。

答案 1 :(得分:0)

&#34;哈利&#34;是const char*类型的字符串。 +1操作获取的地址是&#34; Harry&#34;的起始地址之后的地址,这是字母a的地址。当从第二个字母开始作为字符串打印时,您会得到&#34; arry&#34;。同样地,&#34; Harry&#34; +2获取第一个r字母的地址,因此当您使用r取消引用时,您会获得*。 &#34; Harry&#34; [3]相当于*("Harry"+3),所以你应该得到第二个r字母,它仍然是r

总之,如果您使用*取消引用,则会打印一个字母,但如果您没有取消引用,则会从类型const char*的地址开始打印字符串。

答案 2 :(得分:0)

前两行中的那些整数是偏移的

cout << "Harry" + 1 << endl;

在这种情况下,我们有1个字节的偏移:arry所以它会打印arry

cout << *("Harry" + 2 ) << endl;

在这种情况下,我们有两个字节偏移:rry和解除引用它将打印r

cout << "Harry"[3] << endl;

在这种情况下,它只是索引Harry所以它将打印r这是第4个元素

答案 3 :(得分:0)

让我们从你用“哈利”创造的东西开始吧。

根据定义,您创建的是“const char [6]”。

即 - 一个包含5个字符的数组,以空字符('/ 0')结尾。

如果您理解这一基础,那么Rakete提供的解释应该更有意义,再次假设您了解数组和指针在c ++中是如何工作的,以及示例的相关语法。

记住!数组基于零。所以当你指定var [3]时,你要求的是第4个元素。 var [0]在这种情况下是第一个元素。

当你使用带有cout的流操作符时,你正在操作字符串的起始点,通常是var [0]。

答案 4 :(得分:0)

在C / C ++中,一维数组可以衰减为指向第一个元素的指针。所以当你写my_array + 2时,你得到的是地址数组中的第三个元素。因此,当您撰写*(my_array + 2)时,您会获得,这相当于撰写my_array[2]

因此"*(Harry + 2)""Harry[3]"的输出是相同的(注意:它们都索引不同的元素,只是它们都是'r')。

当您编写"Harry + 1"时,您将第二个元素的地址传递给cout。 cout将此作为字符串的开头处理并打印到结尾,因此你得到"arry"