The C standard requires implementations to support at least the
following two forms of main:
int main(void)
with no arguments, or the form:
int main(int argc, char *argv[])
with two arguments, the first being an int, and the second being a
pointer to pointer to char.
Implementations are free to allow other non-standard forms as well, such
as the one with char **env that you mention above. Code that uses a
non-standard form is not portable, as it will only work on
implementations that support it.
The compiler probably doesnt have any idea that main() is special in
any way.
To the compiler it's just another function to compile.
main is the name of the function that a hosted C implementation must
call when starting your program.
main is special in that it may have a differing number of arguments from
program to program. The compiler must arrange for the correct argument
values to be supplied when the argc/argv form is written, but also work
correctly when the void form is written.
No other C function must be called with a differing number of arguments
depending on how the function was defined.