字符串的差异
Differences in strings
我卡住了为什么*("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"
时,你将第二个元素"arry"