"$@" keeps each argument as its own word (the safe way to forward args); "$*" joins them into a single word separated by the first IFS char (space by default). Option two reverses them. Option three is false — $@ expands all args, not just the first. Option four invents an empty-stripping rule that neither form has.
Official docs