程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C++ 字符數組和字符指針和字符串

C++ 字符數組和字符指針和字符串

編輯:關於C語言

指針是指向變量或者類的地址.但對於字符數組或字符串為什麼不是.請幫我解釋一下,以下的代碼為什麼不顯示地址,而是字符串.
char* Sp="Example One";
char Sa[]="Two";
cout<<Sp<<&Sa[0];
為什麼轉換成了字符串指針後就可以輸出地址?
string* Ss=new string(Sa); //Sa為以上的字符數組
cout<<Ss;


你這個問題問得很好,我們知道實際上一個字符串在進行賦值的時候,例如: 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; 只需要將指針的值(地址值實際上在內存中就是一個整數,標識了內存的地址,只不過編譯器認為其實指針類型罷了,實際上從本質上來說,計算機中的任何類型在內存中都是以二進制的形式存在的,根本沒有所謂的類型之分。為什麼有類型,這就是編譯器將底層抽象的結果)。


char *z;
z="abcd";
這段代碼,實際上是將字符串abcd中a的地址賦給了指針z。
因為在執行z="abcd"的時候,程序首先在內存分配一個可供字符串abcd存放的內存空間,再將指針z設置為指向這段內存空間的第一個地址,也就是存放字符a的地址。

至於樓主的第二個問題……
注意一下,第一個cout<<a<<endl;輸出的並不是a的地址,而是變量b的地址。
*a是解除指針引用的意思,也就是代表存放在指針a內的內存地址中所存放的數據。
因此,*a=&b實際意思是把變量b的實際內存地址賦給了a所儲存的內存地址。cout的結果自然也就是b的內存地址了。



本文出自 “燃燒技術的活力” 博客,請務必保留此出處http://boyishachang.blog.51cto.com/3485129/1274800

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved