我坚持为什么*("Harry" + 2 )
和"Harry"[3]
具有相同的输出(r),但"Harry" + 1
输出为(arry
)。有什么区别?
cout << "Harry" + 1 << endl;
cout << *("Harry" + 2 ) << endl;
cout << "Harry"[3] << endl;
cout << endl;
答案 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"