27
loading...
This website collects cookies to deliver better user experience
a
que possui o endereço de memória 0xc000192020
está armazenando o dado 10
na posição deste endereço.*
junto ao tipo do ponteiro que estamos criando:package main
import "fmt"
func main() {
var p *int
fmt.Println(p) // output: <nil>
}
💡 O tipo do ponteiro indica qual é o tipo de dado que esse ponteiro irá manipular. No caso acima, criamos um ponteiro que pode "apontar" para endereços na memória de variáveis que armazenam dados do tipo inteiro.
0
para int
, false
para bool
...), no caso do nosso ponteiro, o zero value será nil
dado que não atribuímos nenhum valor para ele. Ou melhor dizendo: nenhum endereço!package main
import "fmt"
func main() {
var p *int
i := 10
p = &i // atribuindo o endereço de i para o ponteiro
fmt.Println(p) // output: algo como 0xc000192020
}
💡 O &
usado antes da variável, indica que queremos obter o endereço na memória daquela variável.
💡 Note que o ponteiro que criamos, também possui o seu próprio endereço na memória!
*
junto ao ponteiro (*p
). Esse é o processo de desreferenciar o ponteiro para que, ao invés dele retornar o endereço armazenado, ele ir lá naquele endereço e a partir de lá retornar o valor:package main
import "fmt"
func main() {
var p *int
i := 10
p = &i
fmt.Println(p) // output: 0xc000192020
fmt.Println(*p) // output: 10
}
package main
import "fmt"
func main() {
var p *int
i := 10
p = &i
fmt.Println(p) // output: 0xc000192020
fmt.Println(*p) // output: 10
*p = 20
fmt.Println(i) // output: 20
fmt.Println(*p) // output: 20
}
package main
import "fmt"
func increment(a int) int {
a++
fmt.Println(a) // output: 11
return a
}
func main() {
x := 10
increment(x)
fmt.Println(x) // output: 10
}
package main
import "fmt"
func increment(a *int) {
*a++
fmt.Println(*a) // output: 11
fmt.Println(a) // output: 0xc0000180b0
}
func main() {
x := 10
increment(&x)
fmt.Println(x) // output: 11
fmt.Println(&x) // output: 0xc0000180b0
}
increment
não retorna mais o valor manipulado e que além disso, passou a exigir um ponteiro/endereço de memória como parâmetro (a *int
).increment
não foi duplicado na memória e passamos a trabalhar com a referência da variável x
(que está fora do escopo da função increment
).