Tak, funkcja main bez argumentów jest też poprawna (jak słusznie zauważył shead, w języku C++. W języku C powinniśmy w takim wypadku napisać int main(void) - dzięki!).
Dzięki tym parametrom możesz sprawdzać z jakimi parametrami został wywołany program. Jeżeli np. ktoś wywołał z poziomu terminala lub konsoli twój program w taki sposób:
./program 1 siema 2
To w zmiennej argc wyląduje 4 - zerowym parametrem jest nazwa programu, i do tego jeszcze trzy dodatkowe.
Tablica argv ma taki rozmiar jaką wartość ma argc. Zerowym elementem tej tablicy jest nazwa programu, a kolejne elementy, od 1 zaczynając a na ostatnim kończąc to kolejne parametry wywołania programu.
Oto prosty programik (w języku C) który pokazuje jak z tego korzystać.
#include <stdio.h>
int main(int argc, char* argv[])
{
printf("argc = %d\n", argc);
for (int i = 0; i < argc; i++)
{
printf("argv[%d] = %s\n", i, argv[i]);
}
}
Wywołanie tego kodu dla podanego wyżej przykładu wywołania dało taki efekt:
eryk@Ubuntu:~/test $ ./program 1 siema 2
argc = 4
argv[0] = ./program
argv[1] = 1
argv[2] = siema
argv[3] = 2
Pamiętaj tylko, że wszystkie elementy tej tablicy są zapisane jako char*, nawet parametry będące liczbami.
A co do samego char *argv[]
Ja preferuję nieco inny zapis, tzn char* argv[]. Teraz od razu widać że mamy do czynienia z tablicą - znaki [] elementów typu char* (wskaźników na char, a konkretnie wskaźników na pierwszy element [znak] łańcucha znaków), które są stosowane w języku C do "przechowywania" łańcuchów znaków (tak nie do końca przechowywania, gdyż to tylko wskaźniki)
P.S.
No i oczywiście, niekoniecznie takie nazwy muszą mieć te parametry. Jeżeli chcesz, zamiast argc możesz używać argumentsQuantity, a zamiast argv argumentsArray. Wszystko zależy od twojego gustu, chociaż przyjęło się żeby używać argc i argv, to może nie ma potrzeby robić przeciwko temu ;)