printf的%s與&問題

作者: OnlyCourage (Anan)   2019-08-18 10:04:50
各位大大好!
小弟無意間遇到一個問題,如下
char a[]="hello";
printf("%s", &a[0]);
輸出為hello,但是不是應該要是取a陣列第一個元素的位址嗎?怎麼會是輸出為hello呢?
請各位大大指點指點!
謝謝!
作者: dces4212 (flawless)   2019-08-18 10:08:00
因為妳餵的是%s %s拿到記憶體位置就會一直吐字直到\0對了 如果你要吐字元的話要給int 不能給記憶體位置
作者: chrisdar   2019-08-18 11:19:00
printf("%s",&a[0]); 等效於 printf("%s",a);改這樣吧 printf("%08x", &a[0]);
作者: jepk007 (NW-吉普)   2019-08-18 13:15:00
printf("%p\n",a);
作者: dces4212 (flawless)   2019-08-18 13:40:00
眼瞎沒看到你在問位置.. %p是專門顯示位置用的用%p就不用擔心超過4byte的記憶體位置被截斷(truncated)%x本身用於顯示hex 不像%p會自動補0x 比較直觀不應該説擔心.. 用%x結果輸出被截斷是自己出錯我是指後面給的元素要是int啦xd 因為%c要接的是int
作者: Lipraxde (Lipraxde)   2019-08-18 18:54:00
%c 是輸出字元吧?
作者: edirk (呆呆於)   2019-08-18 23:09:00
你應該先弄清楚矩陣a與a[0]的差異阿,當我沒說,我看錯你的問題了
作者: dces4212 (flawless)   2019-08-19 01:11:00
是字元沒錯 妳這句話讓我想到char,其實我是看到編譯器的警告(expects argument of type int..),現在想想為什麼不是char呢?是說給它大於1byte的變數它會自動截斷
作者: LPH66 (-6.2598534e+18f)   2019-08-19 19:47:00
大概是可變參數的關係: printf 這種可變參數函式若傳不到 int 等級的整數會升成 int 再傳, 所以對編譯器來說那裡是一個 int 參數; 但 printf 內部會看到你寫 %c所以傳進去的東西會截斷到適當大小再輸出
作者: Lipraxde (Lipraxde)   2019-08-20 01:04:00
順帶一提 float 會被轉成 double 喔
作者: sarafciel (Cattuz)   2019-08-20 09:47:00
printf其實不是什麼很基本的東西 它技術的水很深的XD只是初學者需要有一個直觀的手段去驗證寫的程式對不對學C語言才會開頭都先帶他
作者: LPH66 (-6.2598534e+18f)   2019-08-21 15:21:00
沒問題, 但你可以把你這段話裡的 73 換成 's'因為對電腦來說 's' == (char)73 的關係至於是傳 int 進去這一點其實算是技術細節這種技術細節理論上就算你是可變參數實作方也可以不用知道(va_arg 會幫你處理掉這件事)

Links booklink

Contact Us: admin [ a t ] ucptt.com