well my friend, I think if you do some googling you will find tons of answers to your question, however, here is my two cents on this.
C compiler reads your C code, which is a high-level language that we can easily understand and converts it to the machine language. That is said, you should have a C compiler for Intel cpu different than that for the _old_ MAC cpu.
While doing that, the compiler goes into different intermediate steps if you (as a user) want it. It can generate the .o files (the object files) if you ask it to do so, or it can generate the executable file directly.
There are couple of phases in the compilation process. The compiler first invokes a preprocessor to replace its directives (such as the #define statements, or #include statements) with the real stuff. It then calls the lexical analyser to make sure you don't have errors in your syntax, and then it generates the object files that you can use with different programs and then it calls the linker to link all the object files in order to generate the last and final executable file.
There are some other intermediate phase that you force by some switches.
Hope this help...