2012-02-01 106 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是放置下一個單元格的另一個指針(必要時拔出另一個筆)。它和上面一樣。