Fácil Go
Dobrar valor com ponteiro
Enunciado
Escreva uma função dobrar que recebe um ponteiro para int e multiplica o valor apontado por 2. No main, crie uma variável x := 7, chame dobrar(&x) e imprima o novo valor de x.
Requisitos
- A função
dobrardeve ter assinaturafunc dobrar(n *int). - Dentro da função, modifique o valor apontado usando
*n. - No
main, passe o endereço dexcom&x. - Imprima o valor final de
xcomfmt.Println(x).
Código inicial
package main
import "fmt"
func dobrar(n *int) {
// complete aqui
}
func main() {
x := 7
dobrar(&x)
fmt.Println(x)
}
Saída esperada
14
Ver dica
Dentro da função, use *n = *n * 2 ou *n *= 2.
Mostrar solução
package main
import "fmt"
// dobrar recebe um ponteiro para int e dobra o valor apontado.
func dobrar(n *int) {
*n = *n * 2 // desreferencia e modifica o valor original
}
func main() {
x := 7
dobrar(&x) // passa o endereço de x
fmt.Println(x) // 14
}
Passo a passo
- Declaramos
func dobrar(n *int): o parâmetroné um ponteiro paraint. - Dentro da função,
*nacessa o valor armazenado no endereço apontado porn. *n = *n * 2lê o valor atual, multiplica por 2 e grava de volta no mesmo endereço.- No
main,x := 7cria uma variável local. dobrar(&x)passa o endereço dex(um*int) para a função.- Como a função modifica o valor através do ponteiro,
xnomainpassa a valer 14. fmt.Println(x)imprime o valor atualizado.
Por que funciona
O operador & obtém o endereço de x, e o parâmetro n recebe esse endereço. Assim, *n e x referem-se à mesma posição de memória. Qualquer alteração via *n reflete em x. Sem o ponteiro, a função receberia uma cópia e a alteração seria perdida.
Erros comuns
- Esquecer o
*na atribuição:n = n * 2tenta multiplicar um ponteiro por 2, o que gera erro de compilação (invalid operation: n * 2 (mismatched types *int and int)). - Passar o valor em vez do endereço:
dobrar(x)gera erro de compilação (cannot use x (variable of type int) as *int value). - Declarar
func dobrar(n int)e tentar modificarn: a alteração não afetax, poisné uma cópia.
Outra forma de resolver
Retornar o novo valor em vez de usar ponteiro:
func dobrar(n int) int {
return n * 2
}
// main: x = dobrar(x)
Essa abordagem é preferível quando a função não precisa modificar o valor original e sim produzir um novo.
Saída esperada
14