The Code Codex
Tema
← Notas / Fundamentos

nota · texto14 out 2024 · 1 min

Ponteiros

Um ponteiro é uma variável que guarda o endereço de memória de outro valor, em vez do valor em si.

Memória

aponta para

x

endereço 0xc000

valor: 42

p

endereço 0xc008

valor: 0xc000

Memória

aponta para

x

endereço 0xc000

valor: 42

p

endereço 0xc008

valor: 0xc000

Em Go
  • &x pega o endereço de x; *p acessa o valor no endereço.
  • O valor zero de um ponteiro é nil, e acessar *p com p == nil derruba o programa (panic).
  • Não há aritmética de ponteiros (como em C), o que elimina uma classe inteira de bugs.

Go sempre passa argumentos por valor (uma cópia). Para uma função alterar o original, passe um ponteiro:

func double(n int) { n *= 2 } // altera a cópia
func doublePtr(n *int) { *n *= 2 } // altera o original
x := 21
double(x) // x continua 21
doublePtr(&x) // x agora é 42

Ponteiros também evitam copiar structs grandes e permitem métodos que alteram o receptor (func (u *User) Rename(...)).

Em Java

Java não tem ponteiros explícitos, mas toda variável de objeto é uma referência (na prática, um ponteiro gerenciado). E Java também passa tudo por valor: o valor passado é a cópia da referência.

void rename(User u) { u.setName("Ana"); } // altera o objeto original
void replace(User u) { u = new User("Ana"); } // só troca a cópia local da referência

Por isso dá para alterar um objeto recebido, mas não dá para escrever um swap(a, b) que troque as variáveis de quem chamou. Uma referência vazia é null, o equivalente ao nil de Go.

Veja também: Ponteiros em Go e Variáveis e constantes.