Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Dúvida no exercício com potência utilizando ponteiro

Meu programa imprimia o resultado 0 quando apertava enter e quando o script estava assim(continua depois do código):

#include <stdio.h>

int expoente(int* a, int* b, int* re, int* i){

    for(i = 0; i < b; i++){
    (*re) = (*re)*(*a);
    }
    return (*re);

}



int main(){
    int re = 1;
    int a,b,i;

    printf("Digite o numero e seu expoente: \n");
    scanf("%d%d", &a,&b);
    expoente(&a,&b,&re,&i);
    printf("O resultado eh: %d\n", re);

}

Mas agora, fiz uns ajustes e o programa rodou normal. Gostaria de saber porque não deveria utilizar ponteiro em A e B para realizar a operação proposta pela função exponencial. Segue o código modificado:

#include <stdio.h>

int expoente(int a, int b, int* re){

    for(int i = 0; i < b; i++){
    (*re) = (*re)*(a);
    }
    return (*re);

}



int main(){
    int re = 1;
    int a,b;

    printf("Digite o numero e seu expoente: \n");
    scanf("%d%d", &a,&b);
    expoente(a,b,&re); //Porque usar ponteiro apenas em "re"?
    printf("O resultado eh: %d\n", re);

}
1 resposta
solução!

Oi Vinicius,

Primeiro vamos entender porque o código inicial não funciona. Não há nada de errado com a função main, mas existem alguns problemas na função expoente.

Quando você chama expoente(&a,&b,&re,&i), você está passando o endereço das variáveis a, b, re, e i. Por isso, caso você deseje modificar seu conteúdo, você precisa desreferenciar esses ponteiros. Você fez isso com os ponteiros re e a, mas não fez com b e i. O seguinte código funciona:

int expoente(int* a, int* b, int* re, int* i){
    for((*i) = 0; (*i) < (*b); (*i)++){
        (*re) = (*re)*(*a);
    }
    return (*re);
}

Um pequeno detalhe é que o return (*re) não é utilizado para nada, então sua função poderia ser do tipo void.

É importante entender que quando mexemos no ponteiro *re, estamos mexendo diretamente na variável re que foi declarada na função main. Quando passamos a própria variável e não seu endereço, a função expoente cria uma cópia local da variável, portanto qualquer alteração dentro da função expoente nada afeta a função main.

No nosso caso, como nós não queremos alterar as variáveis a e b e podemos declarar a variável i dentro da função, não há necessidade de utilizarmos ponteiros, pois as cópias locais são suficientes para realizar nossas contas.

Deu para sacar? Essa parte de ponteiros é bem confusa mesmo.