As you know, a char() stores a fixed length. If you define char(100), and you know your strings are never going to exceed 20 characters, then you're wasting 80 bytes (or more!) per row.
As you also know, varchar() stores a variable length record. If you define varchar(100), then even of all of strings happen to be 20 characters or less, you're still not "wasting" any space.
Here's the mySQL man documentation:
http://dev.mysql.com/doc/refman/5.0/en/char.html
I'm not sure if this information is all still accurate, but you might also be interested in this link:
What are the optimum varchar sizes for MySQL?