C 中字元型變數的位址輸出

2021-07-02 04:23:16 字數 1285 閱讀 8670

在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的...