数组的名字表示了它的首地址即a代表a[0]的地址(即a等效于&a[0]),由于数组占用一块连续的内存空间,所以将首地址依次向后偏移就能得到数组中其他元素的地址。也就是说a+i等效于&a[i]; scanf接收到值后,会放到你给的地址的内存中去,所以sanf("%d",&a[i]);是一个合法赋值,同理sanf("%d",a+i);等效,而sanf("%d",a[i]);是非法的,因为a[i]表示的是元素,而不是地址。