C ++:指针输出令我困惑

时间:2012-02-01 00:05:16

标签: c++ pointers

所以我有以下代码:

    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;

我确实尝试过推理结果,但我无法弄明白。 谢谢。

6 个答案:

答案 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