The ttys are not just input/output devices. They also do a special job of acting as the controlling terminal for a session, like sending signals (Ctrl+C). /dev/ttyNN are virtual consoles, which are full screen displays on the monitor.
The terminals start from /dev/tty1. You could switch to these consoles, usually, by pressing Ctrl+Alt+Fn keys.
e.g, Ctrl+Alt+F1 takes you to the first virtual terminal. Nowadays, most of the Linux distributions run the X server from the tty1. So, pressing Ctrl+Alt+F1 may not have an effect.
$ ps ax | grep Xorg | grep -v grep
1504 tty1 Ss+ 44:57 /usr/bin/Xorg :0 -background none -verbose -auth /var/run/gdm/auth-for-gdm-rfsWyA/database -nolisten tcp vt1
Ctrl+Alt+F2 will take you to the second terminal. Usually the distributions run a login program(agetty) on the virtual terminal.
$ ps ax | grep tty2 | grep -v grep
31865 tty2 Ss+ 0:00 /sbin/agetty tty2 38400
The login programs provide you a login prompt and lets you login with username/password. The init scripts decides, where all the login program will be run. So depending on that you may or may not see a login prompt on, say tty9. To go back to your GUI interface, press Ctrl+Alt+F1(as in example output above).
/dev/tty0 is a special device, which points to the current terminal. So, irrespective of where you run it from(any virtual console), anything read from/written to tty0 goes to your current terminal.
The second column in 'ps ax' also gives the controlling terminal of the program. For some programs, like daemons, you may see that the column is '?', which means they are not bound to a terminal.
/dev/pts/0 etc are psuedo-terminal devices, which are not attached to the system display. for e.g, terminal you get when you open a gnome-terminal or any other GUI terminal. These are client-server based approach where client side will be exported to programs, like bash. The data send by the program to the pseudo terminal is sent to the 'server' side (which is usually monitored by another program, like gnome-terminal). The controlling process (server side) determines what needs to be sent to the terminal, which is eventually seen by the client. These devices help you to open multiple 'GUI terminals' without any limit on your system, still providing the same old terminal like controls(ioctl(), colour setting, Sending signals [Ctrl+C] etc. ).