Because zsh does not split parameter expansions by default, $ary and
$ary[*] and $ary[@] are equivalent when not quoted, as Lawrence
demonstrated.
However, in all three of those cases, empty elements are typically
discarded, as they would be in a shell that defaults to splitting.
That's why "$ary[@]" is still useful: It quotes each element
individually, so empty elements are preserved.
(Aside, in bash and ksh, $ary is equivalent to ${ary[0]}, not to
${ary[*]}. A little oddly, this is also true for their associative
arrays, that is, the value for key 0 is used.)
I know it's far too late to fret this stuff, still it's interesting
to contemplate these design level issues. P.F. did the right thing
not splitting by default but he should have left the empties in by
default too, IMHO. Options should be positive not negative as a
fundamental principle. Don't do helpful things automatically, and
force me to stop you from doing them. Much better to leave things
alone, and if I want, say, empty elements removed, I'll ask for them
to be removed. A=B should mean that A is identical to B, not B with
blanks removed, nor sorted, nor capitalized, nor duplicates removed,
nor checked for spelling, nor ... nothing.