所以我有以下代码:
cout << _userLoginName << endl;
cout << *_userLoginName << endl;
cout << (_userLoginName+1) << endl;
cout << *(_userLoginName+1) << endl;
变量char * _userLoginName
已设置为"smith"
。我的问题很简单:为什么在最后一行代码中我得到以下输出?
smith // as from cout << _userLoginName << endl;
s // as from cout << *_userLoginName << endl;
mith // cout << (_userLoginName+1) << endl;
m // cout << *(_userLoginName+1) << endl;
我确实尝试过推理结果,但我无法弄明白。 谢谢。
答案 0 :(得分:3)
如果你给cout
1 一个char *
,它会尝试打印一个字符串。如果您给它char
,那么它将打印该单个字符。
_userLoginName
和(_userLoginName+1)
的类型为char *
; *_userLoginName
和*(_userLoginName+1)
的类型为char
。
<子> 1。从技术上讲,“给std::operator<<(std::ostream &, T)
”。
答案 1 :(得分:2)
拉出一张纸,画一个带有六个格子的盒子,里面写着“史密斯”:
+-+-+-+-+-+--+
|s|m|i|t|h|\0|
+-+-+-+-+-+--+
^ ^
| +- _userLoginName + 1
+- _userLoginName
使用笔作为指针'_userLoginName'并将其指向第一个单元格。去指针(即使用*ptr
指针ptr
)意味着查看它指向的单元格的内容。即'* _userLoginName'显示在单元格的内容中。编写类型为char*
或char const*
的指针可以做一些有趣的事情:它跟随指针并写入它找到的每个单元格的内容,直到它到达具有值\0
的单元格。
这应该解释第一个输出。现在,ptr + 1
查看ptr
旁边的单元格,即ptr + 1
是另一个指针(如有必要,拉出另一支笔)放置下一个单元格。它与上面的内容完全相同。
答案 2 :(得分:0)
考虑*_userLoginName
的类型 - 它是char
。
也许您在此上下文中忽略了*
取消引用指针?
答案 3 :(得分:0)
取消引用指针(例如*_userLoginName
)总是返回指针指向的元素,如果是普通字符串,则返回其中的第一个字符,然后打印出来。
将n
添加到指针(例如_userLoginName+1
)会使指针递增n
步,因此如果它指向第0个元素,则它将指向第n个元素。 / p>
将两者结合起来解释第四行。
答案 4 :(得分:0)
第一个cout
正在查看指针userLoginName
(char *和char []在c ++中非常相似)。 cout
将打印内存中的所有值,将它们视为字符,直到遇到'\0'
字符,该字符终止字符串。
第二个cout
正在查看userLoginName
指向的一个内存元素,或userLoginName[0]
。
第三个cout
与第一个char
的作用相同,但内存地址比userLoginName晚1个字符,因为指针的类型为userLoginName[1]
。
最后一个cout与第二个cout相同,但是{{1}}。
答案 5 :(得分:0)
operator<<
在这里有两个独立的重载:一个用于char-pointers,另一个用于chars。第二个,对于单个字符,只打印一个字符。对于char指针,第一个将指针视为指向以null结尾的字符数组(“字符串”)中第一个字符的指针,并打印所有这些字符。
将此与a[i]
与数组*(a + i)
的{{1}}相同的语言语法相结合,您可以:
a