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.

C
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}
Keluaran
nilai = 75
*p    = 75
nilai setelah *p = 90: 90
p menunjuk ke nilai: ya
Dua operator penting
OperatorNamaArtinya
&nilaiAlamat dariMenghasilkan alamat variabel nilai
*pDereferensiMengakses 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.

C
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}
Keluaran
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).

C
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}
Keluaran
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}.

Jalankan contoh kode di pelajaran ini tanpa instalasi lewat compiler C online.

Tandai pelajaran ini selesai

Masuk ke aplikasi untuk mencatat kemajuan, lalu lanjutkan ke pelajaran berikutnya dari perangkat mana pun.

Buka di aplikasi