I jedziemy, słówko po słówku… Pogrubieniem zaznaczyłem różnice: double pow (double base, double exponent); double pow (double base, int exponent); To co pogrubiłem, to jest typ danych. Zatem ta funkcja akceptuje/potrafi odróżnić, jako drugi parametr dwa typy - int oraz double. Int to liczba całkowita, double to zmiennoprzecinkowa. Ot cała różnica. Możesz wywołać funkcję tak:
pow(2.0,3); // zwróci 8.0
// albo tak:
pow(2.0, 3.1); // zwróci mniej więcej 8.5
Kompilator C wie jaką funkcję ma wywołać, bo zna typy argumentów. To się ogólnie nazywa przeciążaniem funkcji.