Для чего нужен метод main?
В операционной системе есть часть системного кода целью которой является "Запуск программы на выполнение". Когда Вы "жахаете" дважды по exe-файлу эта часть создает процесс, создает первичный поток, проецирует куски данных из вашего exe-файла на регионы памяти в процесс и др. не менее важные процессы.
Когда сис.загрузчик хочет найти и передать управление первичному потоку, он должен ответить на вопрос "А где искать машинный код для первичного потока?". Он, сис.загручик, знает как устроен формат exe-файла и отыскивает значение указателя где расположен код, откуда следует начать работу программы записанной в exe-файле. Для exe-файлов смотри хидер winnt.h в IMAGE_OPTIONAL_HEADER поле AddressOfEntryPoint.
В каждом, современном исполняемом файле, как правило, две точки входа. Одна из них является ничем иным "стартовым кодом", иногда именуемая runtime-code или "стабом". Эта часть генерируется компилятором и достаточно часто повторяется для всех файлов генерируемых компилятором. А другая часть "пользовательская", вот это пользовательская и есть Ваша main(). Но ее наименование можно по-другому настроить(см. документацию к Вашему компилятору).
Что рантайм-код, что Ваша main() это ни что иное как функции обратного вызова. Их вызывает сам сис.загрузчик. После того как рантайм-код записан в файл, указатель на него записывается в AddressOfEntryPoint(см.выше), в процессе работы в недрах сгенерированного рантайм-кода есть переход на вашу main().
Суть main - точка входа. Программа должна откуда-то "начать" своё исполнение. Когда система запускает ваше приложение, она вызывает в нем main. Не могу понять, что непонятного.