A buffer doesn't have to correspond to a file, e.g. "built-in" stuff like
Messages or
Help or
scratch. I often "C-x b asdlkfj RET" to create a new "scratch" buffer for quickly jotting down something or transforming something. I can of course save that buffer to file, or I can just kill it.
When coding elisp, you often use the (with-temp-buffer …) macro to do more or less the same thing :-)
Also, several buffers can correspond to one file: "C-x 4 c" runs clone-indirect-buffer-other-window which creates two views on one and the same file. This is not the same as splitting the window: The two buffers can each have their own, different narrowings applied. Say you have two functions defined in one file, they're almost the same, so you want to compare them. Now, clone the buffer, narrow the first buffer to the first function, the second to the second, and now you can run ediff on the two buffers :-) Or you can even open the same file in different major modes at the same time …