潇湘沐
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...