Fácil C

Dobrar um valor por referência

Enunciado

Escreva uma função void dobrar(int *n) que multiplica por 2 o inteiro apontado por n. No main, leia um inteiro, chame dobrar passando o endereço e imprima o resultado.

Requisitos

  • A função dobrar recebe int * e modifica o valor apontado com *n.
  • A chamada no main usa o operador &.
  • A saída segue exatamente o formato dobro=<valor>.

Código inicial

#include <stdio.h>

void dobrar(int *n) {
    /* complete aqui */
}

int main(void) {
    int x;
    scanf("%d", &x);
    /* chame dobrar e imprima */
    return 0;
}

Saída esperada

dobro=14
Ver dica

Dentro de dobrar, use *n = *n * 2;. No main, chame dobrar(&x).

Mostrar solução
#include <stdio.h>

/* Recebe o endereço de um int e dobra o valor apontado. */
void dobrar(int *n) {
    *n = *n * 2;   /* escreve no endereço recebido */
}

int main(void) {
    int x;
    scanf("%d", &x);
    dobrar(&x);    /* passa o endereço de x */
    printf("dobro=%d\n", x);
    return 0;
}

Passo a passo

  1. void dobrar(int *n) declara que a função recebe um ponteiro para inteiro; nada é devolvido por return.
  2. *n = *n * 2; lê o valor apontado, multiplica por 2 e grava de volta no mesmo endereço.
  3. No main, scanf("%d", &x) guarda a entrada em x.
  4. dobrar(&x) passa o endereço de x; a função altera a variável original.
  5. printf imprime o valor já modificado de x.

Por que funciona

Em C os argumentos são copiados. Se passássemos x (sem &), a função receberia uma cópia e a alteração seria perdida. Passando &x, a cópia é o endereço; ao desreferenciar com *n, escrevemos no mesmo local de memória de x.

Erros comuns

  • void dobrar(int n) { n = n * 2; }: altera só a cópia local; x no main continua igual.
  • dobrar(x): erro de compilação (passa int onde se espera int *).
  • scanf("%d", x): passa o valor em vez do endereço; comportamento indefinido. Use &x.

Outra forma de resolver

Se a intenção fosse retornar um novo valor sem alterar o original, usaríamos int dobro(int n) { return n * 2; } e x = dobro(x);. A versão com ponteiro é preferível quando já temos o endereço e queremos evitar cópias ou alterar in place.

Saída esperada

dobro=14