Hola,
1) y 2) main sí devuelve un dato, el llamado "return code" o "exit status" (error level en DOS), échale un ojo a esto:
http://en.wikipedia.org/wiki/Exit_status. Por lo tanto, main necesita devolver un int.
3) No llego a comprender esta pregunta. Un prototipo es una "definición previa" de una función. En el código que muestras se define el prototipo porque la implementación de "multiplicar" aparece después de que se use. Podrías ahorrarte el prototipo poniendo la implementación de "multiplicar" antes del main.
4) Por "primer void" y "segundo void" creo que te refieres a la declaración e implementación de "multiplicar". El primero lleva coma porque no es una implementación, no hay código definido para la función. El segundo no lleva coma porque tiene código dentro (el bloque definido por las llaves).
5) main define el punto de inicio del programa y sus argumentos no son inútiles. Una definición correcta de main es:
Código C:
Ver originalint main( int argc, const char* argv[])
- El valor devuelto (int) es para lo que te comenté arriba.
- argc indica el número de parámetros que se le han pasado al programa por línea de comandos.
- argv contiene cada uno de los parámetros que enumera argc. argv[0] contiene el nombre del propio ejecutable.
6) void sirve para punteros y para indicar que una función no tiene parámetros o que no devuelve valor. Ahora, como en C todo es un puntero...
Espero no estar haciéndote los deberes, porque el formato de la pregunta deja cierta duda XD
Un saludo :)