當前位置:編程學習大全網 - 編程語言 - c++字符數組結束符問題

c++字符數組結束符問題

妳這個問題問得很好,我們知道實際上壹個字符串在進行賦值的時候,例如: char *p="hello world";這樣賦值是允許的。那麽這並不代表"hello world"這個就是壹個指針,實際上我們的這壹動作,編譯器在幕後為我們做了很多事,首先在常量區分配壹個字符數組,然後將"hello world"這個字符串中的字符(包括最後的'\0'字符。)拷貝到此數組(其實此數組我們可以看成是壹個匿名數組,因為沒有數組名)。然後返回數組首元素的地址,將此地址賦值給字符指針變量p。我們知道在c語言中沒有字符串這種類型,在c語言中的字符串是通過字符數組來實現的,而且必須要求此字符數組具有'\0'結束符。這就是字符串與壹般的字符數組不同的地方。

話說回來,妳問到為什麽char *p="hello world"; cout<<p<<endl;打印出來的是字符串,而不是地址。其實當初我也想到過類似的問題,沒有找到權威的答案,但是我能夠猜出幾分。C++語言是兼容C語言的,所以在輸出C串的時候是直接以給出的首地址,輸出,直到遇到結束符'\0'結束。為什麽會這樣呢,我想著應該是語言的特性,或者是編譯器的特性。既然C語言中字符串是通過帶'\0'的字符數組實現的,那麽請問如果編譯器是由妳來實現的,或者是printf()函數是妳寫的,要輸出壹個字符串的話妳會怎麽樣呢,妳是不是會輸出指針的地址呢,cout<<p<<endl;這樣的形式讓讀者壹目了然,我要輸出的就是壹個字符串,而實際上p就是壹個字符指針變量而已,為什麽輸出字符串,這在於cout的實現了,cout的實現我不的而知,但是可以肯定的是cout確實在遇到字符指針的時候會將做出這樣的行為:將此指針當做首地址,向下輸出字符,直到遇到'\0'結束為止。 這就是cout的行為,沒有為什麽。 其實妳自己可以寫壹個自己的cout函數,輸出地址而不是按照cout的默認行為。當然要實現cout的功能,必須要了解很多底層知識。

我們可以通過這樣的方式輸出字符指針的值,而不是輸出以其為首地址的字符串。例如char a='A'; char *p=&a; cout<<(int)(p)<<endl; 只需要將指針的值(地址值實際上在內存中就是壹個整數,標識了內存的地址,只不過編譯器認為其實指針類型罷了,實際上從本質上來說,計算機中的任何類型在內存中都是以二進制的形式存在的,根本沒有所謂的類型之分。為什麽有類型,這就是編譯器將底層抽象的結果)。

  • 上一篇:汽車的氣動閥怎麽調?
  • 下一篇:孩子玩電腦好嗎?
  • copyright 2024編程學習大全網