字符串的差异

Differences in strings

本文关键字:字符串      更新时间:2023-10-16

我卡住了为什么*("Harry" + 2 )"Harry"[3]有相同的输出(r),但"Harry" + 1输出是(arry)。有什么不同?

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

"Harry" + 1指向H后面的一个字符,所以现在字符串"丢失"了一个字符,H

*("Harry" + 2)指向H后面2个字符,因此它指向第一个r。将其解引用为单个字符,即r

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

"Harry"为const char*类型的字符串。+1操作获取的地址在"Harry"的起始地址后面1,即字母a的地址。当作为字符串打印时,从第二个字母开始,你得到"ry"。类似地,"Harry"+2获得第一个r字母的地址,因此当使用*解引用时得到r。"Harry"[3]相当于*("Harry"+3),所以你应该得到第二个r字母,它仍然是r

总之,如果使用*解引用,则打印一个字母,但如果不解引用,则打印一个从地址类型const char*开始的字符串。

前两行的整数为偏移量

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

在本例中,我们有1个字节的偏移量:所以它会打印出

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

在本例中,我们有两个字节的偏移量:ry和解引用,它将打印r

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

在这个例子中它只是索引Harry所以它会输出r也就是第四个元素

让我们从您创建的"Harry"开始。

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

也就是——一个由5个字符组成的数组,以空字符('/0')结尾。

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

回忆!数组是从零开始的。所以当你指定var[3]时,你要求的是第4个元素。Var[0]在本例中是第一个元素。

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

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

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

当你写"Harry + 1"时,你将第二个元素

地址传递给cout。cout将此作为字符串的开始并打印到末尾,因此您得到的输出为"arry"