在char a[10];,a和&a只是值相等,其性质是完全不同的,a是a[0]元素的地址&a[0],a+1就是a[1]的地址&a[1]了;而&a是整个数组a的地址,&a+1就跳过这个数组了,是a[10]所在的地址了。你可以用printf("%p %p\n",a+1,&a+1);来检查它们的性质。但在有的
编译器下,char a[];scanf("%s",a);与scanf("%s",&a);的效果是一样的,比如VC++6.0。这不能不说是这类编译器的一个bug。C是一种语法比较松散的语言,有不少边缘化的细节没有规定统一的解释,造成了不同的编译器有不同的解释。知道有这么回事就行了,写代码时提倡写意义明确的表示法,如本例提倡前者而不提倡后者。