c语言scanf不用取地址符,关于c中printf和scanf函数是否使用取地址符的疑问

本文探讨了C语言中数组与指针的联系,指出数组在函数参数传递时会退化为指针。在使用scanf进行输入时,需要提供变量的地址,因为scanf的参数是期待指针。对于数组,不加取地址符即可,但使用取地址符可能导致警告。C++在这方面有所不同,允许用引用传递数组,但不能按值传递。总结了在何时使用取地址符的规则,并提供了相关链接深入理解。
摘要由CSDN通过智能技术生成

e73eb05a483789c7d9163debb36f383b.png

潇湘沐

OP需要先知道C语言的datatypes:thetypevoidbasictypesthetypecharsignedintegertypes...unsignedintegertypes...floatingtypesenumeratedtypesderivedtypesarraytypespointertypes...很清晰的可以看见,指针(pointer)和数组(array)两个都是derivedtype,而且是两个不同的类型,但是由于C语言的类型系统太弱了,有很多隐式转化(implicitlycast).此处str就是从arraytypedecay到了pointertype.为什么scanf方法在给其他类别对象赋值的时候一定需要加取地址符?因为scanf的parameter是pointer.更宽泛的说,所有数组在传参时都会decay到指针类型.c++则有了些许变动,可以允许用引用来传递数组,但是已经无法按值传递数组.请问为什么这里的scanf和printf中有无取地址符均能运行?&是取地址符(addressof)但表达式&arr取的不是地址而是指针,不过其中蕴含了地址信息.如果你用&str:#includeintmain(){charstr[80];inti=0;scanf("%s",&str);printf("%s",str);return0;}warning:formatspecifiestype'char'buttheargumenthastype'char()[80]'[-Wformat]这个warning很明显了.既然str能decay到指针,就别在用&了.只有在不能退化成指针的时候,再用&,比如inta;scanf("%d",&a);.延伸阅读:http://tieba.baidu.com/p/3993...https://stackoverflow.com/que...https://stackoverflow.com/que...https://stackoverflow.com/que...https://stackoverflow.com/que...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值