157 lines
4.6 KiB
Markdown
157 lines
4.6 KiB
Markdown
---LESSON_INFO---
|
|
**Learning Objectives:**
|
|
- 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)` |
|
|
| Pass by reference | Mengirim alamat memori | `function(&variable)` |
|
|
| Akses melalui pointer | Mengakses anggota struktur | `ptr->member` |
|
|
| Dereferensi | Mengakses nilai dari pointer | `*pointer` |
|
|
|
|
---EXERCISE---
|
|
|
|
# Latihan: Fungsi Ulang Tahun
|
|
|
|
Tulislah fungsi bernama `birthday`, yang menambahkan satu ke `age` dari `person`.
|
|
|
|
**Requirements:**
|
|
- Gunakan pointer ke struktur person
|
|
- Akses anggota age menggunakan operator arrow (->)
|
|
- Tambahkan 1 ke usia
|
|
|
|
**Expected Output:**
|
|
```
|
|
John is 27 years old.
|
|
Happy birthday! John is now 28 years old.
|
|
```
|
|
|
|
Try writing your solution in the code editor below!
|
|
|
|
---KEY_TEXT---
|
|
person * p
|
|
p->age++
|
|
void birthday
|
|
---END_KEY_TEXT---
|
|
|
|
---EXPECTED_OUTPUT---
|
|
John is 27 years old.
|
|
Happy birthday! John is now 28 years old.
|
|
---END_EXPECTED_OUTPUT---
|
|
|
|
---INITIAL_CODE---
|
|
#include <stdio.h>
|
|
|
|
typedef struct {
|
|
char * name;
|
|
int age;
|
|
} person;
|
|
|
|
/* deklarasi fungsi */
|
|
void birthday(person * p);
|
|
|
|
/* tulis fungsi Anda di sini */
|
|
|
|
int main() {
|
|
person john;
|
|
john.name = "John";
|
|
john.age = 27;
|
|
printf("%s is %d years old.\\n", john.name, john.age);
|
|
birthday(&john);
|
|
printf("Happy birthday! %s is now %d years old.\\n", john.name, john.age);
|
|
return 0;
|
|
}
|
|
---END_INITIAL_CODE---
|
|
|
|
---SOLUTION_CODE---
|
|
#include <stdio.h>
|
|
|
|
typedef struct {
|
|
char * name;
|
|
int age;
|
|
} person;
|
|
|
|
/* deklarasi fungsi */
|
|
void birthday(person * p);
|
|
|
|
void birthday(person * p){
|
|
p->age++; // Ini sama dengan..
|
|
//(*p).age++; // ... seperti ini
|
|
}
|
|
|
|
int main() {
|
|
person john;
|
|
john.name = "John";
|
|
john.age = 27;
|
|
printf("%s is %d years old.\\n", john.name, john.age);
|
|
birthday(&john);
|
|
printf("Happy birthday! %s is now %d years old.\\n", john.name, john.age);
|
|
return 0;
|
|
}
|
|
---END_SOLUTION_CODE--- |