C++:指针输出让我感到困惑

C++: Pointers outputs confusing me

本文关键字:指针 输出 C++      更新时间:2023-10-16

所以我有以下代码:

    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;

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

如果你给 cout 1 一个char *,它将尝试打印一个字符串。 如果你给它一个char,那么它将打印那个字符。

_userLoginName(_userLoginName+1)属于char *型; *_userLoginName*(_userLoginName+1)属于 char 型。


1.从技术上讲,"给std::operator<<(std::ostream &, T)"。

拿出一张纸,画一个盒子,里面有六个单元格,上面写着"smith":

+-+-+-+-+-+--+
|s|m|i|t|h||
+-+-+-+-+-+--+
 ^ ^
 | +- _userLoginName + 1
 +- _userLoginName

使用笔作为指针"_userLoginName"并将其指向第一个单元格。取消对指针的引用(即对指针ptr使用 *ptr (意味着查看它指向的单元格的内容。也就是说,"*_userLoginName"显示在单元格的内容中。编写 char*char const* 类型的指针会做一些有趣的事情:它跟随指针并写入它找到的每个单元格的内容,直到它到达值为 的单元格。

这应该解释第一个输出。现在,ptr + 1查看ptr旁边的单元格,即 ptr + 1是放置在下一个单元格的另一个指针(如有必要,请拔出另一支笔(。它的作用与上面相同。

考虑*_userLoginName的类型 - 它是char

也许您忽略了在这种情况下*取消引用指针?

取消引用指针(例如 *_userLoginName (始终返回指针指向的元素,如果是普通字符串,则返回其中的第一个字符,然后打印。

向指针添加n(例如 _userLoginName+1 (会使指针增加 n 步,因此如果它指向第 0 个元素,则随后将指向第 n 个元素。

将两者结合起来解释第四行。

第一个cout是查看指针userLoginName(char* 和 char[] 在 c++ 中非常非常相似(。cout将打印内存中的所有值,将它们视为字符,直到遇到终止字符串的''字符。

第二个cout是查看一个由 userLoginNameuserLoginName[0] 指向的内存元素。

第三个cout与第一个相同,但内存地址比 userLoginName 晚 1 个字符开头,因为指针的类型为 char

最后一个 cout 与第二个相同,但userLoginName[1] .

这里有两个单独的重载用于operator<<工作:一个用于字符指针,一个用于字符指针。第二个,对于单个字符,只需打印该字符。第一个用于字符指针,将指针视为指向以 null 结尾的字符数组("字符串"(中第一个字符的指针,并打印所有这些字符。

将此与a[i]与数组a*(a + i)相同的语言语法相结合,您将得到:

cout << s;      // prints all characters, starting at the first
cout << *s;     // prints only the first character, equal to "cout << s[0];"
cout << s + 1;  // prints all  characters, starting at the second
cout << *(s+1); // prints only the second character, equal to "cout << s[1];"