> For the complete documentation index, see [llms.txt](https://davidwinalda94.gitbook.io/mastering-golang/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://davidwinalda94.gitbook.io/mastering-golang/pointer.md).

# Pointer

Pointer adalah suatu variabel yang berisi alamat memori dari suatu nilai atau data.

Perhatikan kode di bawah ini:

![Penggunaan pointer pada variabel x](/files/-MSNtMfMsVyUYhr0qzN9)

![Output menampilkan nilai dan alamat memori tempat nilai tersimpan](/files/-MSNtVRpN-aSTvtGqDsc)

Kita bisa lihat bahwa terdapat variabel `age` yang berisi nilai `26` . Lalu sebuah variabel `x` yang berisi alamat memori dari nilai variabel `age` ditandai dengan expression `&` di depan nama variabel.

{% hint style="info" %}
`age` berisi nilai 26

`x` berisi alamat memori tempat nilai `age` yaitu `26` tersimpan
{% endhint %}

Lalu bagaimana jika kita ingin mendapatkan nilai `age` dari variabel `x` atau biasa disebut dereferrencing? Kita dapat melakukannya dengan cara menggunakan expression `*` di depan variabel `x` seperti di bawah ini:

![Mengakses nilai age melalui variabel x](/files/-MSNuRxCVbFuSDbPzeeL)

![Output program menampilkan nilai dari variabel age](/files/-MSNugFIsHPxRXkYG8nu)

### Mengubah nilai dari variabel yang mengakses suatu memori

Masih menggunakan contoh di atas, bagaimana jika kita meng-assign variabel baru pada variabel `x` ?

Variabel `x` telah memiliki keterikatan dengan variabel `age` yaitu variabel `x` berisi alamat memori dari nilai `age` . Jadi jika kita mengubah atau meng-assign nilai baru ke dalam variabel `x` maka akan mengubah juga nilai dari variabel `age` karena berada di memori yang sama.

![Melakukan perubahan nilai pada variabel x yang berpengaruh pada variabel age](/files/-MSNw5_xYWzeMuaGup6R)

![Nilai variabel x dan age menjadi 30](/files/-MSNwG7u-j98NWcRqklc)

Pada kode di atas jika kita ingin meng-assign nilai baru pada variable Pointer, maka harus menambahkan expression `*` di depan variabel sehingga menjadi `*x = 30` .

### Menggunakan pointer dengan keyword `var`

Jika kita mendeklarasikan pointer dengan menggunakan keyword `var` ada perbedaan sedikit di penulisan sintaks:

![Deklarasi variabel pointer menggunakan keyword var](/files/-MSNyhWtFkidIK69lkTq)

Untuk hasil kode di atas akan sama dengan hasil program sebelumnya. Yang perlu diperhatikan adalah saat mendeklarasikan variabel untuk di jadikan sebagai Pointer harus di tambahkan expression `*` di depan tipe data.

### Penerapan Pointer

Salah satu contoh penerapan Pointer adalah ingin mengakses data yang ada di dalam function. Pada kode di bawah ini terdapat sebuah function `change` yang mengembalikan nilai baru `new` ke nilai yang lama `old` .&#x20;

```go
package main

import (
	"fmt"
)

func main() {
	// Inisialisasi variabel number
	number := 20
	fmt.Println("Nilai variabel number sebelum memanggil function: ", number)
	fmt.Println("Alamat memori number sebelum memanggil function: ", &number)
	fmt.Println("----")

	change(number, 40)

	fmt.Println("Nilai variabel number setelah pemanggilan function", number)
	fmt.Println("Alamat memori number setelah pemanggilan function", &number)
	fmt.Println("----")
}

func change(old int, new int) {
	old = new
	fmt.Println("Nilai variabel di dalam function: ", old)
	fmt.Println("Alamat memori di dalam function: ", &old)
	fmt.Println("----")
}
```

![Output program menampilkan nilai variabel dari function main dan function change](/files/-MSSbFyIQlJYK_bjQaoa)

Untuk bisa mengakses nilai yang sama dengan yang ada di dalam function `change` , maka kita bisa menggunakan Pointer seperti berikut ini:

```go
package main

import (
	"fmt"
)

func main() {
	number := 20
	fmt.Println("Nilai variabel number sebelum memanggil function: ", number)
	fmt.Println("Alamat memori number sebelum memanggil function: ", &number)
	fmt.Println("----")
	
	// Argumen yang dikirim adalah alamat memori dari number
	change(&number, 40)

	fmt.Println("Nilai variabel number setelah pemanggilan function", number)
	fmt.Println("Alamat memori number setelah pemanggilan function", &number)
	fmt.Println("----")
}

// Untuk menampung alamat memori, harus menggunakan * pada parameter old
func change(old *int, new int) {
	*old = new
	fmt.Println("Nilai variabel di dalam function: ", *old)
	fmt.Println("Alamat memori di dalam function: ", old)
	fmt.Println("----")
}
```

![Output program mengacu pada alamat memori yang sama](/files/-MSSc-TJfr-VaMVqCUZ4)
