Because it is trying to prevent you making a mistake, and you not realizing it.
When you write
set_color((color *)(&a));
You are explicitly converting it - telling the compiler "this is the value I wanted to send, I know what I am doing" so it lets it through.
When you write
set_color(&a);
It could be a mistake - you might not have realised that "a" was not a color at all. So it raises an error so you can fix the problem before it becomes a run time problem and causes an odd bug.