在c++中,如果cout乙個字元陣列的話,那麼它會沿著這個位址,一直輸出這個字串,直到遇到'\0',例如:
char*c="cadn\0hello";
cout<
輸出的結果是:cadn
如果我們自作聰明的想輸出第乙個字元的位址,例如這樣輸出:
cout<<&c[0]<
不幸的是,這樣輸出的結果依舊不是我們需要的位址。
但是,如果我們回歸到c語言的話,例如用printf的話,如下:
printf("%x\n",&c[0]);
幸福的事情發生了,輸出的結果是:
46f020
的確是字串的首位址,但是,如果我們要輸出字串的位址,難道就這一種方法嗎?難道我們就不可以用我們c++上的cout達到我們的效果嗎?
原因:c是靠%s,%x,%p來區分指標表示式&a[0]的輸出形式的;c++沒有這個格式控制,只能按一種形式輸出,對char*型別的指標值就理解為串輸出,所以必須對這個指標表示式做型別轉換處理。
例如:char c='a';
cout<<」 &c:」<<&c<
輸出的仍然不是字元變數c的位址。
在c++中,字串是以空終止符('/0')結尾的字元陣列,通過字串中第乙個字元的指標訪問字串。也就是說,字串的值是字串中第乙個字元的(常量)位址。如下的面3種形式表示:
char *str="string";
charstr2="string2";
charstr3=;
cout<<"line 1:str="<
cout<<"line 2:str2="<
cout<<"line 3:str3="<
執行可知,這3行的輸出就是儲存的字串的值,而並非我們認為的位址。那麼,我們可以聯絡到前面&c,其實這就是乙個char *的變數,所以,輸出的自然就應該是字串的值。可是,&c儲存的字串是沒有終止符的,因此輸出的也就是亂碼了。
最近,在讀到《c++程式設計教程》(第4版)第12章的時候,我才解決了這個疑惑。實際上,c++標準庫中i/o類對輸出操作符《過載,
在遇到字元型指標時會將其當做字串名來處理,輸出指標所指的字串
。既然這樣,我們就別讓他知道那是字元型指標,所以得進行型別轉換,即:希望任何字元型的指標變數輸出為位址的話,都要作乙個轉換,即強制char *轉換成void *,如下所示:
cout<<"static_cast(&c)="<(&c)<
cout<<"static_cast(str)="<(str)<
此時,可以看到輸出的結果就是char型別變數和字串變數的位址了。
關於C 中char 型變數的位址輸出
在剛開始學習c c 過程中,我們希望輸出各個變數的位址來窺探一些我們 百思不得其解 的現象,例如搞清函式堆疊相關的程式內部秘密。先看下面示例 將原始碼中 修改為 我們看到同樣作為char型的變數m char2輸出位址正常,修改為 為什麼會出現這樣現象,字串是以空終止符 0 結尾的字元陣列,通過字串中...
c 中關於char型變數與字串位址的輸出
參考至 在c裡面如果指標是乙個基本數值型 int foalt long等,如果輸出裡有 cout ptr endl 其中ptr是指標的名,則輸出的值是指標的位址,如果是char char指標 則輸出的是char指標的值。在c 中,熟悉int和char型的變數是最基本不過的了,不過,我想,很多初學者會...
c 關於char型變數與字串位址的輸出
在c裡面如果指標是乙個基本數值型 int foalt long等,如果輸出裡有 cout ptr endl 其中ptr是指標的名,則輸出的值是指標的位址,如果是char char指標 則輸出的是char指標的值。int i 97 char c a cout line 1 i 我想,對於line 1的...