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