2014-09-20 146 views
0

之後的所有元素要重新創建我的這個小問題,使用此代碼(是的,它bruteforced並且可以精簡下來):C++指針,指向字符數組特定元素返回指定一個

char hello[] = "John"; 
char *ptr1 = &hello[0]; 
char *ptr2 = &hello[1]; 
char *ptr3 = &hello[2]; 
char *ptr4 = &hello[3]; 
std::cout << ptr1 << "$"; 
std::cout << ptr2 << "$"; 
std::cout << ptr3 << "$"; 
std::cout << ptr4 << "$"; 

,你可能會看到嘗試此代碼後,它返回以下內容:

​​

我不知道爲什麼它需要指定的所有元素之後。

任何幫助?

回答

1

這是因爲你正在打印指針,而不是它指向的東西。並且C程序中的指針通常指向char[]的開始,其代表'\0'終止的字符串。這就是爲什麼std::ostream(其中cout是一個實例)有一個重載的<<運算符,它輸出整個字符串,直到結束符。

要先打印只是字符,取消引用指針:

std::cout << *ptr1 << "$"; 

你也可以使用引用來代替,該在很大程度上視爲該數值本身的替代品:通過

char &ptr1 = hello[0]; 
1

ptr1ptr4也是指向字符的指針,因此<<會將它們視爲字符串,並將它們打印出來,從而爲您提供所見。

如果你只是想在每個位置上的字符,該格式的行:

char ch1 = hello[0]; 

將工作,這將改變輸出到:

std::cout << *ptr1 << "$"; 
+0

剛看到托馬斯的時候看到了你的答案。感謝您及時的回覆。 – Code0 2014-09-20 06:46:24

0

,如果你想在打印值特定地址然後:

std::cout << *ptr1 << "$"; 
std::cout << *ptr2 << "$"; 
std::cout << *ptr3 << "$"; 
std::cout << *ptr4 << "$"; 
0

我不完全確定,但如果它cout收到一個字符指針,它會pri nt,直到它到達內存空白爲止(C風格的字符串),如果你只是想打印一個字符,你應該只打印變量的內容,這意味着只傳遞內容而不是內存位置。

1

你的問題似乎是基於一些完全沒有根據的預期。看起來您希望代碼爲每個cout << ...行打印一個字符。但你爲什麼期望這樣做呢?您在代碼中發送給cout的內容其實是char *指針。你爲什麼期望cout解除引用那爲你指針和打印字符?預期的正常情況是在輸出(地址)中看到指針值,而不是字符值。

所以,你真的應該問的問題不是「爲什麼它從我的數組打印幾個字符?」。你應該真正問的問題是「爲什麼它會打印我的任何角色?」。你永遠不會取消你的指針。然而,輸出不是指針值,而是包含指針指向的一系列char對象。即顯然cout決定解除引用你的指針,即使你從未明確要求它。這是你應該問的問題:爲什麼我的指針會被取消引用?

而答案是[const] char *指針在使用<<運算符發送到cout時會受到特殊處理。有專門爲此目的而引入的專用重載版本<<。該版本的<<運算符會將char *指針視爲指向C字符串的開頭。並且該運算符將輸出整個C字符串一直到零終止符字符。這正是您實驗中發生的情況。

請注意,如果您使用任何其他指針類型(例如int *),您將看不到輸出中的指向值(或多個值)。您將看到指針本身的實現相關表示。

相關問題