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 dobrar deve ter assinatura func dobrar(n *int).
  • Dentro da função, modifique o valor apontado usando *n.
  • No main, passe o endereço de x com &x.
  • Imprima o valor final de x com fmt.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

  1. Declaramos func dobrar(n *int): o parâmetro n é um ponteiro para int.
  2. Dentro da função, *n acessa o valor armazenado no endereço apontado por n.
  3. *n = *n * 2 lê o valor atual, multiplica por 2 e grava de volta no mesmo endereço.
  4. No main, x := 7 cria uma variável local.
  5. dobrar(&x) passa o endereço de x (um *int) para a função.
  6. Como a função modifica o valor através do ponteiro, x no main passa a valer 14.
  7. 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 * 2 tenta 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 modificar n: a alteração não afeta x, pois n é 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