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
dobrarrecebeint *e modifica o valor apontado com*n. - A chamada no
mainusa 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
void dobrar(int *n)declara que a função recebe um ponteiro para inteiro; nada é devolvido porreturn.*n = *n * 2;lê o valor apontado, multiplica por 2 e grava de volta no mesmo endereço.- No
main,scanf("%d", &x)guarda a entrada emx. dobrar(&x)passa o endereço dex; a função altera a variável original.printfimprime o valor já modificado dex.
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;xnomaincontinua igual.dobrar(x): erro de compilação (passaintonde se esperaint *).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