Really the main reason for avoiding global variables is to avoid global state. It can make your program more difficult to debug since a global can be modified from literally anywhere in the program. It can make it difficult to reuse code, since it isn't going to be clear what globals are required for code to work correctly. It can also lead to "lazy" designs that are more difficult to modify or maintain. Take your character example for instance - what if you decide later that you want to have two characters instead of one? 5 characters? A random number? Since all of your code dealing with characters is tied to this global variable, now you're going to have to go back and modify all of it in order to support the new design.

Now, there are some people who religiously hold the view "no globals at all, ever, period, no exceptions", but most people tend to agree that there are times when it's simply easier to use a global and be done with it. For example, cin and cout in the standard library are global stream objects. It's also common to see things like loggers set up using globals.