- Memahami konsep passing by reference dalam bahasa C
- Belajar menggunakan pointer untuk mengirim argumen ke fungsi
- Mengenal perbedaan antara passing by value dan by reference
- Memahami penggunaan operator arrow (->) dalam struktur
**Prerequisites:**
- Pemahaman tentang pointer dan fungsi
- Pemahaman dasar tentang struktur
---END_LESSON_INFO---
# Argumen Fungsi dengan Referensi dalam C
Dengan mengasumsikan Anda sekarang memahami pointer dan fungsi, Anda menyadari bahwa argumen fungsi dilewatkan berdasarkan nilai, yang berarti mereka disalin masuk dan keluar dari fungsi. Tetapi bagaimana jika kita melewatkan pointer ke nilai-nilai daripada nilai-nilai itu sendiri? Ini akan memungkinkan kita memberikan fungsi kontrol atas variabel dan struktur dari fungsi induk dan bukan hanya salinan dari mereka, sehingga langsung membaca dan menulis objek asli.
Mari kita asumsikan kita ingin menulis fungsi yang menambahkan angka satu ke angka berikutnya, disebut `addone`. Ini tidak akan bekerja:
```c
void addone(int n) {
// n adalah variabel lokal yang hanya ada dalam cakupan fungsi
n++; // karena itu peningkatan tidak memiliki efek
}
int n;
printf("Sebelum: %d\\n", n);
addone(n);
printf("Setelah: %d\\n", n);
```
Namun, ini akan bekerja:
```c
void addone(int *n) {
// n adalah pointer di sini yang menunjuk ke alamat memori di luar cakupan fungsi
(*n)++; // ini akan secara efektif meningkatkan nilai dari n
}
int n;
printf("Sebelum: %d\\n", n);
addone(&n);
printf("Setelah: %d\\n", n);
```
Perbedaannya adalah versi kedua dari `addone` menerima pointer ke variabel `n` sebagai argumen, dan kemudian bisa memanipulasinya, karena tahu di mana itu berada di memori. Perhatikan bahwa ketika memanggil fungsi `addone`, kita **harus** melewatkan referensi ke variabel `n`, dan bukan variabel itu sendiri - ini dilakukan agar fungsi tahu alamat dari variabel, dan tidak hanya menerima salinan dari variabel itu sendiri.
## Pointer ke struktur
Mari kita asumsikan kita ingin membuat fungsi yang memindahkan titik maju dalam arah `x` dan `y`, disebut `move`. Alih-alih mengirimkan dua pointer, kita sekarang bisa mengirimkan hanya satu pointer ke fungsi dari struktur titik:
```c
void move(point * p) {
(*p).x++;
(*p).y++;
}
```
Namun, jika kita ingin dereferensi struktur dan mengakses salah satu anggota internalnya, kita memiliki sintaks singkat untuk itu, karena operasi ini banyak digunakan dalam struktur data. Kita bisa menulis ulang fungsi ini menggunakan sintaks berikut:
```c
void move(point * p) {
p->x++;
p->y++;
}
```
---
## Tabel Passing Argumen dalam C
| Metode | Deskripsi | Contoh |
|--------|-----------|--------|
| Pass by value | Mengirim salinan nilai | `function(value)` |