1樓:滄海雄風
本來這個問題並不複雜,但是由於題主個別概念有些問題,所以還是深入回答一下。
a本身的值確實只是乙個const char*型別的位址。但c++中cout是被定義好的乙個類的物件,
它和運算子「<<」連用時《發生過載,語義被解釋為輸出《右端指示的字串。具體是通過運算子過載實現,類似於呼叫函式,只是右運算元作為位址被傳入這個函式,然後函式內解析位址進行輸出。注意過載是區分型別的,
所以如果a不是字元陣列名而是int變數或者其它型別的話,
(只要有定義過——對於基本型別在stl中已有定義)呼叫的是不同的輸出函式,
仍能得到正確結果。至於這裡的具體行為,是由過載的運算子(函式)
對傳入的引數指向的位址開始依次(從低位址到高位址,逐個地)
掃瞄並輸出該位址的char字元(準確來說是寫入標準輸出流stdout,
至於stdout裡的字元怎麼跑到螢幕上的實現過程是作業系統的事),直至遇到'\0'停止執行。
它和c標準i/o方式的printf("%s",a)類似(而不是puts(a),puts會把末尾的'\0'轉化為換行)。
a是char型別,這是不確切的。
a在編譯期由右端的字串字面量(引號為邊界的部分)初始化,確定為常量,型別為const char而不是char。
無論如何,這確實是乙個位址常量而非指標(以整數形式儲存位址值的變數),這點是正確的。但lz並沒提到指標- -...
經過引數傳遞後,位址常量退化為對應型別的指標。也就是說在「<<」過載函式對應實現的內部而言,通過值參傳遞(a的值被複製在函式內產生乙個副本),可以成為乙個const char*型別的變數。注意這裡const指指標指向的內容不可改變,而不是指標本身的值不可改變。
----
robinren240 提到的大體正確,細節錯誤上面已經說了。
----
qds316 說:「當使用cout()或者printf()輸出該型別變數,就是字串陣列的時候,就會輸出資料直至遇到\0為止」。
這裡有問題。首先,cout()寫法錯誤;其次,a是常量,不是變數。當然,對於cout來說,常量作為「<<」的運算元也能和變數以一樣的形式輸出(參見以上討論),因為本身是唯讀操作,而a又是可以合法訪問的,自然沒有影響。
----
以上討論的問題引發的關於陣列名稱的問題:
陣列名本身是個位址常量,但是某些特殊情況下它的語義可以發生改變。例如sizeof(a),這時a表示整個陣列物件(這裡指語法物件,不是指類的例項)而不是這個常量本身。基於這個語義,對陣列名取位址也是合法的,對於陣列a來說&a的結果等於a這個位址常量本身的值。
這是c/c++標準委員會為了維護語法物件a作為乙個左值(l-value)總可以取位址這條原則的妥協。
----
c/c++是傳統的強型別語言。盡可能清楚掌握「型別」對於理解程式和寫出更高質量c/c++的**都有幫助。
2樓:扈懷煒
在 c、c++中,字元陣列的陣列名指向字元陣列的首位址,在輸出時,會吧整個陣列看成乙個字串輸出,也就是說這裡認為a是乙個字串。
3樓:匿名使用者
因為c++知道 a是乙個字元指標,知道要輸出字串
cout從首位址開始輸出,直到遇到字串結束字元'\0'結束輸出
char a在c 中應該怎麼表示
因為像 等等字元在程式中有特別的用途,所以為了正常使用它,就需要複雜一點的表示了,此時c中用 來引起一個表示式就是了。後邊的表示式有幾種,一種就是引起 等然後就是引起一個8進位制表示式如 054,其中0必須有,表示8進位制或者一個十六進位制的表示式 x9f,其中x表示十六進位制,同樣不可省略這種情況...
求解釋c語言中char a中的2是什麼意思是指能輸入的最大字元數還是什麼?最多能輸幾個字元和字元組
就是陣列能輸入2個字元。char a 2 這是宣告。宣告變數 a 是 char 型陣列,有2個元素。語句裡 寫 a 0 表示它是 char 型陣列a 裡的 第乙個 元素 a 1 是 char 型陣列a 裡的 第二個 元素。語句例子 a 0 a a 1 x printf c c n a 0 a 1 c...
如圖,在Rt ABC中,C 90,AC 10cm,BC 5cm,一條線段PQ AB,P,Q分別在AC和過A點且
結論應為 幾秒後 abc和 apq全等 已知條件缺乏,或錯誤,問題如下 1,缺乏 沒有p或q點的起始位置,無法計算多長時間後,三角形全等!2,錯誤 線段pq ab不變時,p,q兩點在規定軌跡上移動的瞬時速度不能相等,不可能同時以每秒2cm速度移動!關於2,證明如下 按圖,設p點的起始位置為ac中點。...