The return'ed int from main is given back to the operating system as the ' exit status '. Conventionally, a status of 0 indicates the program was successful, other values indicate various failures. The compiler needs to know about a function before the program makes use of it. The compiler does not need the definition, just what goes in and what comes out. However, it is often good form to use the formal parameter names, so that it is clear which arguments are which.
Function declarations can go anywhere variable declarations can.
This is often more convenient than passing lots of arguments. In C dereferencing a pointer to a function is equivalent to calling the function. A plotting program might need to be able to draw a line on one of several different kinds of output devices. The program can be written to execute code pointed to by a function pointer, the pointer can be set to point at one of a number of different line functions depending on the user selection of output device. An array of function pointers is often used for this purpose.