在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型別變數和字串變數的位址了。
DbgPrint列印字串
1 直接列印字串。dbgprint hello world 2 空結尾的字串,你可以用普通得c 語法表示字串常量 char variable string hello world dbgprint s variable string 3 空結尾的寬字串 wchar 型別 wchar string w...
Scala列印字串
1 字串,通過 號連線 2 printf用法 字串,通過 傳值。3 字串模板 通過 獲取變數值 列印字串 val username zhangdan val userage 20println 使用者名稱 username 使用者年齡 userage scala中簡化了關於json的表達 print...
C 中列印字元指標的位址
問題描述 今天無意中遇到乙個問題,有如下程式,我想列印兩個物件中的字元指標的位址來驗證系統提供的賦值運算子過載是否是淺拷貝,結果直接cout字元指標輸出的並不是指標的位址而是整個字串,為什麼呢?define crt secure no warnings include include using n...