Memori · Pelajaran 9 dari 12
Pointer
11 menit baca · BelajarCode
Setiap variabel disimpan di memori pada sebuah alamat. Pointer adalah variabel yang menyimpan alamat variabel lain.
1#include <stdio.h>23int main(void) {4 int nilai = 75;5 int *p = &nilai;67 printf("nilai = %d\n", nilai);8 printf("*p = %d\n", *p);9 *p = 90;10 printf("nilai setelah *p = 90: %d\n", nilai);11 printf("p menunjuk ke nilai: %s\n", p == &nilai ? "ya" : "tidak");12 return 0;13}nilai = 75 *p = 75 nilai setelah *p = 90: 90 p menunjuk ke nilai: ya
| Operator | Nama | Artinya |
|---|---|---|
&nilai | Alamat dari | Menghasilkan alamat variabel nilai |
*p | Dereferensi | Mengakses isi memori di alamat yang disimpan p |
Pada deklarasi int *p, tanda * artinya "p adalah pointer ke int". Di luar deklarasi, *p artinya "isi yang ditunjuk p".
Pass by reference
Dengan pointer, fungsi bisa mengubah variabel milik pemanggil.
1#include <stdio.h>23void tukar(int *a, int *b) {4 int sementara = *a;5 *a = *b;6 *b = sementara;7}89void bagi_dua(int angka, int *hasil, int *sisa) {10 *hasil = angka / 2;11 *sisa = angka % 2;12}1314int main(void) {15 int x = 3, y = 8;16 tukar(&x, &y);17 printf("x = %d, y = %d\n", x, y);1819 int h, s;20 bagi_dua(17, &h, &s);21 printf("17 / 2 = %d sisa %d\n", h, s);22 return 0;23}x = 8, y = 3 17 / 2 = 8 sisa 1
Pointer juga cara C mengembalikan lebih dari satu nilai, seperti fungsi bagi_dua. Inilah alasan scanf membutuhkan &: scanf perlu alamat variabel supaya bisa mengisinya.
Pointer dan array
Nama array bisa dipakai sebagai pointer ke elemen pertamanya. arr[i] sama dengan *(arr + i).
1#include <stdio.h>23int main(void) {4 int arr[] = {10, 20, 30, 40};5 int *p = arr;6 printf("%d %d %d\n", arr[2], *(arr + 2), *(p + 2));7 p++;8 printf("Setelah p++, *p = %d\n", *p);9 printf("Jarak p dari awal array: %ld elemen\n", (long)(p - arr));10 return 0;11}30 30 30 Setelah p++, *p = 20 Jarak p dari awal array: 1 elemen
Aritmetika pointer dihitung dalam satuan elemen, bukan byte. p + 1 menunjuk elemen berikutnya, yaitu 4 byte setelahnya untuk int.
NULL
Pointer yang belum menunjuk apa pun sebaiknya diberi nilai NULL. Mendereferensi pointer NULL membuat program berhenti, tetapi kesalahan itu jauh lebih mudah dilacak daripada pointer yang berisi alamat acak.
Cek pemahaman
Jika int a = 5; int *p = &a; *p = *p + 1;, berapa nilai a sekarang?
Latihan
Statistik dengan pointer
Tulis fungsi void statistik(const int data[], int n, int *min, int *max, double *rata) yang mengisi nilai terkecil, terbesar, dan rata-rata lewat pointer. Uji dengan {12, 7, 25, 3, 18}.
Pembahasan
1#include <stdio.h>23void statistik(const int data[], int n, int *min, int *max, double *rata) {4 *min = *max = data[0];5 long long total = 0;6 for (int i = 0; i < n; i++) {7 if (data[i] < *min) *min = data[i];8 if (data[i] > *max) *max = data[i];9 total += data[i];10 }11 *rata = (double)total / n;12}1314int main(void) {15 int data[] = {12, 7, 25, 3, 18};16 int kecil, besar;17 double rata;18 statistik(data, 5, &kecil, &besar, &rata);19 printf("min=%d max=%d rata=%.1f\n", kecil, besar, rata);20 return 0;21}min=3 max=25 rata=13.0
Jalankan contoh kode di pelajaran ini tanpa instalasi lewat compiler C online.