看板 C_and_CPP 關於我們 聯絡資訊
各位大大好! 小弟無意間遇到一個問題,如下 char a[]="hello"; printf("%s", &a[0]); 輸出為hello,但是不是應該要是取a陣列第一個元素的位址嗎?怎麼會是輸出為hello呢? 請各位大大指點指點! 謝謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 101.12.145.232 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1566093892.A.BE8.html
dces4212: 因為妳餵的是%s %s拿到記憶體位置就會一直吐字直到\008/18 10:08
dces4212: 對了 如果你要吐字元的話要給int 不能給記憶體位置08/18 10:15
chrisdar: printf("%s",&a[0]); 等效於 printf("%s",a);08/18 11:19
chrisdar: 改這樣吧 printf("%08x", &a[0]);08/18 11:20
jepk007: printf("%p\n",a);08/18 13:15
dces4212: 眼瞎沒看到你在問位置.. %p是專門顯示位置用的08/18 13:40
dces4212: 用%p就不用擔心超過4byte的記憶體位置被截斷(truncated)08/18 13:41
dces4212: %x本身用於顯示hex 不像%p會自動補0x 比較直觀08/18 13:44
dces4212: 不應該説擔心.. 用%x結果輸出被截斷是自己出錯08/18 13:47
大概瞭解了!感謝各位! 不過有一點還是不太懂,就是d大一開始說的如果要吐字元的話就應該要給int,想問的是如 果吐字元不就是用%c,後面要給陣列元素嗎?int是什麼意思? 謝謝各位大大! ※ 編輯: OnlyCourage (101.12.145.232 臺灣), 08/18/2019 16:02:44
dces4212: 我是指後面給的元素要是int啦xd 因為%c要接的是int08/18 18:23
Lipraxde: %c 是輸出字元吧?08/18 18:54
edirk: 你應該先弄清楚矩陣a與a[0]的差異08/18 23:09
edirk: 阿,當我沒說,我看錯你的問題了08/18 23:12
dces4212: 是字元沒錯 妳這句話讓我想到char,其實我是看到編譯器08/19 01:11
dces4212: 的警告(expects argument of type int..),現在想想為08/19 01:14
dces4212: 什麼不是char呢?是說給它大於1byte的變數它會自動截斷08/19 01:17
LPH66: 大概是可變參數的關係: printf 這種可變參數函式 08/19 19:47
LPH66: 若傳不到 int 等級的整數會升成 int 再傳, 所以對編譯器 08/19 19:48
LPH66: 來說那裡是一個 int 參數; 但 printf 內部會看到你寫 %c 08/19 19:48
LPH66: 所以傳進去的東西會截斷到適當大小再輸出 08/19 19:49
沒想到感覺很基本的printf, %c, %s原來背後的意義這麼多0.0,小弟我還太淺了 哈哈哈 ※ 編輯: OnlyCourage (101.12.145.232 臺灣), 08/20/2019 00:44:14
Lipraxde: 順帶一提 float 會被轉成 double 喔08/20 01:04
sarafciel: printf其實不是什麼很基本的東西 它技術的水很深的XD08/20 09:47
sarafciel: 只是初學者需要有一個直觀的手段去驗證寫的程式對不對08/20 09:49
sarafciel: 學C語言才會開頭都先帶他08/20 09:50
你說的沒錯! 關於printf %c的觀念,我想請各位大大幫我做個確認。 char a='s'; printf("%c", a); s的ascii是73,所以%c需要一個int傳入,所以a得值是73傳入%c,所以才會printf出s字元 。這樣的說法不知道是不是有問題?還請各問指教了 謝謝 ※ 編輯: OnlyCourage (101.12.145.232 臺灣), 08/21/2019 12:16:33
LPH66: 沒問題, 但你可以把你這段話裡的 73 換成 's' 08/21 15:21
LPH66: 因為對電腦來說 's' == (char)73 的關係 08/21 15:22
LPH66: 至於是傳 int 進去這一點其實算是技術細節 08/21 15:22
LPH66: 這種技術細節理論上就算你是可變參數實作方也可以不用知道 08/21 15:23
LPH66: (va_arg 會幫你處理掉這件事)08/21 15:23
大致上瞭解了!謝謝各位! ※ 編輯: OnlyCourage (49.217.196.134 臺灣), 08/22/2019 00:45:33