Olá Ezequiel.
É preciso primeiro entender o conceito de ponteiros, e eu não sei se isso já foi abordado no curso.
Um ponteiro não guarda a informação em si. Ele guarda um endereço de memória, que se você for lá, terá as informações que deseja.
Dessa forma:
int num = 5;
"num" é um número inteiro que guarda o valor 5. Mas:
int* ptr_para_inteiro;
Esse ptr_para_inteiro é um ponteiro, ou seja: guarda um endereço de memória. Se você for até esse endereço, vai encontrar um número inteiro. Nós dizemos então que ele é um "ponteiro para int". Se quisermos ir até esse endereço e obter as informações que lá estão, colocamos um asterisco antes dele. Assim:
int* ptr_para_inteiro;
*ptr_para_inteiro = 7; // fomos até o endereço que ele está apontando e colocamos o valor 7
A função potencia
recebe o endereço de memória de um inteiro, que seria aquele parâmetro int* resultado
, e um número que será a base e o outro que será o expoente. O resultado dessa potenciação é armazenado diretamente nesse variável chamada "resultado". A função modifica a variável informada para que ela fique com o valor resultante do cálculo.
Na linha 17:
Como a função potencia
recebe um endereço de memória que tem um número inteiro. Não podemos passar diretamente o inteiro para ela, precisamos passar o endereço onde o inteiro está. Para captar o endereço de uma variável, colocamos um "&" antes dela. Por isso a função está sendo chamada como
potencia(&resultado, 10, 5);