That's not entirely true. In general, this is more how it actually works:
getchar() simply reads the char from the buffer of the FILE *. If you don't have anything in the buffer to read, the OS-specific read function is called. The printing of the char to the screen is NOT done by getchar(). That is done by your shell/OS read function/etc. etc..
The default behavior of your system is to echo chars from beyond stdin into the screen. Think about it for a second. The chars are being printed to the screen BEFORE it's even accepted by stdin (because stdin actually wraps the OS version of stdin).
Functions like getch() actually change the terminal settings so echoing is NOT done in this manner. On Windows this is done with SetConsoleMode() I believe. For *nix systems you have to similarly play with the settings and have it so the output is not echoed to stdout.
In fact, I think both Windows and *nix systems allow you to preserve the terminal settings. You might be able to write a program which changes your terminal mode, quits, and then you could start another program which uses the new terminal mode where getchar() would behave like getch(). ;)

