2012-02-01 65 views
1

所以我有以下代码:C++:指针输出困惑我

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

考虑类型*_userLoginName —它是char

也许你忽略了在这方面解引用的指针*

3

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

_userLoginName(_userLoginName+1)char *类型; *_userLoginName*(_userLoginName+1)的类型为char


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

+0

如何打印实际值然后(参数的地址)? – Yokhen 2012-02-01 00:11:50

+0

@Yokhen:要打印地址,您通常可以使用类似'cout << static_cast (_userLoginName)'的方式逃脱。 – 2012-02-01 00:12:41

0

解引用指针(例如*_userLoginName)总是返回指针指向的元素,如果是普通字符串,则其中的第一个字符将被打印出来。

添加n的指针(如_userLoginName+1)递增n步骤的指针,因此,如果它指的第0个元素将事后指向第n个元素。

结合两者来解释第四行。

0

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

第二个cout正在寻找一个存储元件,指向userLoginNameuserLoginName[0]

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

最终的cout与第二个相同,但是是userLoginName[1]

0

operator<<在这里有两个单独的重载:一个用于字符指针,另一个用于字符。第二个,对于单个字符,只需打印该字符。第一个字符指针将指针视为指向空字符串(“字符串”)中第一个字符的指针并打印所有这些字符。

与语言的语法结合这一点,a[i]相同*(a + i)一个数组a,你必须:

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];" 
2

拉出一张纸和画一个框有六个单元与“史密斯”写入它们:

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

用你的笔作为你的指针'_userLoginName'并将它指向第一个单元格。取消对指针的撤销(即对指针ptr使用*ptr)意味着查看它指向的单元格的内容。这就是'* _userLoginName'显示到单元格的内容。编写一个类型为char*char const*的指针会做一些有趣的事情:它跟随指针并写入找到的每个单元格的内容,直到它到达具有值\0的单元格。

这应该解释第一个输出。现在,ptr + 1查看ptr旁边的单元格,即ptr + 1是放置下一个单元格的另一个指针(必要时拔出另一个笔)。它和上面一样。