"$*" outputs all parameters ($1, $2, etc) as a single unit. For that reason it's supposed to always be quoted, or else bash's word separation function will also affect the output.
"$@" outputs all parameters as individual items, that is, loops and things like that will treat each item as a separate unit, whether they have spaces in them or not. Note that you still have to quote the variable to prevent word separation though.
The same pattern works in array elements as well.
The section on positional parameters on this page details the behavior: