Cara Menggunakan Pointer pada Bahasa C untuk Pemula

Laptop menampilkan kode pointer bahasa C di editor teks dengan catatan diagram alamat memori

Banyak orang belajar bahasa C sampai fungsi dan array, lalu berhenti saat bertemu pointer. Sebenarnya cara menggunakan pointer pada bahasa C cuma soal dua hal: menyimpan alamat sebuah variabel, lalu mengambil nilai yang ada di alamat itu. Kalau kamu paham dua langkah itu, sisa materinya cuma variasi.

Apa Itu Pointer dan Kenapa Dipakai

Pointer adalah variabel yang isinya alamat memori, bukan nilai biasa seperti angka atau karakter. Setiap variabel di program C menempati lokasi tertentu di memori, dan lokasi itu punya alamat.

Alasan pointer dipakai: fungsi di C menerima argumen secara copy. Kalau kamu kirim variabel biasa ke fungsi, fungsi itu bekerja pada salinan. Dengan pointer, fungsi bisa mengubah nilai asli di pemanggil. Pointer juga dipakai untuk mengelola array, string, dan memori dinamis.

Deklarasi Pointer dan Operator & serta *

Dua simbol yang wajib kamu kenali:

  • & (ampersand) menghasilkan alamat dari sebuah variabel.
  • * (asterisk) dipakai saat deklarasi pointer, dan saat membaca nilai di alamat yang ditunjuk (dereferensi).

Contoh deklarasi dan pemakaian dasarnya:

#include <stdio.h>

int main(void) {
    int umur = 21;
    int *p = &umur;

    printf("nilai umur   : %dn", umur);
    printf("alamat umur  : %pn", (void *)&umur);
    printf("isi pointer  : %pn", (void *)p);
    printf("nilai via *p : %dn", *p);

    *p = 30;
    printf("umur sekarang: %dn", umur);

    return 0;
}

Baris int *p = &umur; dibaca: p adalah pointer ke int, dan isinya alamat variabel umur. Saat kamu menulis *p = 30;, kamu menimpa nilai umur lewat alamatnya. Variabel umur ikut berubah karena keduanya menunjuk lokasi memori yang sama.

Beda antara p dan *p

Tipe datanya berbeda. p bertipe int *, sedangkan *p bertipe int. Ini penting saat kamu membaca pesan error compiler, karena kesalahan tipe pointer paling sering muncul dari sini.

Mengubah Nilai Variabel Lewat Fungsi

Ini pemakaian pointer yang paling sering kamu temui. Bandingkan dua versi fungsi berikut:

#include <stdio.h>

void tambah_salah(int x) {
    x = x + 1;
}

void tambah_benar(int *x) {
    *x = *x + 1;
}

int main(void) {
    int skor = 10;

    tambah_salah(skor);
    printf("setelah tambah_salah: %dn", skor);

    tambah_benar(&skor);
    printf("setelah tambah_benar: %dn", skor);

    return 0;
}

tambah_salah menerima salinan, jadi skor tetap 10. tambah_benar menerima alamat, jadi skor berubah jadi 11. Pola inilah yang dipakai fungsi standar seperti scanf, yang butuh alamat variabel supaya bisa mengisi nilainya.

Pointer dan Array

Nama array di ekspresi C meluruh menjadi pointer ke elemen pertamanya. Artinya arr setara dengan &arr[0]. Jadi kamu bisa mengakses elemen array lewat pointer.

#include <stdio.h>

int main(void) {
    int nilai[4] = {70, 85, 90, 60};
    int *p = nilai;
    int i;

    for (i = 0; i < 4; i++) {
        printf("nilai[%d] = %dn", i, *(p + i));
    }

    return 0;
}

*(p + i) sama dengan p[i]. Aritmetika pointer menambah alamat sebesar ukuran tipe yang ditunjuk, bukan satu byte. Pada mesin dengan int 4 byte, p + 1 menambah alamat sebanyak 4 byte.

Pointer dan string

String di C adalah array karakter yang diakhiri karakter nol ''. Kamu bisa menelusurinya dengan pointer:

#include <stdio.h>

int main(void) {
    const char *nama = "compiler";

    while (*nama != '') {
        putchar(*nama);
        nama++;
    }
    putchar('n');

    return 0;
}

Setiap iterasi mencetak satu karakter, lalu pointer maju satu posisi. Loop berhenti saat bertemu ''.

Kesalahan Umum Saat Memakai Pointer

Berikut beberapa jebakan yang sering bikin program crash atau hasilnya aneh:

  1. Dereferensi pointer yang belum diinisialisasi. int *p; *p = 5; menulis ke alamat acak.
  2. Dereferensi setelah memori dibebaskan dengan free. Ini disebut dangling pointer.
  3. Lupa memeriksa hasil malloc, yang bisa mengembalikan NULL kalau memori tidak tersedia.
  4. Tipe pointer tidak cocok, misalnya int * dipaksa jadi char * tanpa alasan jelas.
  5. Pointer keluar dari batas array. Akses di luar rentang tidak dicegat C dan bisa merusak data lain.

Untuk pointer kosong sebelum dipakai, inisialisasi dengan NULL. Periksa juga sebelum dereferensi:

int *p = NULL;
if (p != NULL) {
    printf("%dn", *p);
}

Alokasi Memori Dinamis Secara Singkat

Pointer juga dipakai untuk meminta memori saat program berjalan. Fungsi malloc mengembalikan alamat blok memori yang bisa kamu pakai, dan free mengembalikannya ke sistem.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int n = 5;
    int *data = malloc(n * sizeof(int));
    int i;

    if (data == NULL) {
        printf("alokasi gagaln");
        return 1;
    }

    for (i = 0; i < n; i++) {
        data[i] = i * 10;
    }

    for (i = 0; i < n; i++) {
        printf("%d ", data[i]);
    }
    printf("n");

    free(data);
    data = NULL;

    return 0;
}

Setelah free, isi pointer dijadikan NULL supaya tidak dipakai lagi secara tidak sengaja.

Latihan Kecil yang Bisa Kamu Coba

Supaya konsepnya menempel, buat program yang:

  • Mendeklarasikan dua variabel int dan dua pointer.
  • Menukar nilai kedua variabel lewat sebuah fungsi yang menerima dua pointer.
  • Mencetak nilai sebelum dan sesudah penukaran.
  • Menambahkan satu array dan mencetak isinya memakai aritmetika pointer.

Compile dengan gcc -Wall -Wextra file.c -o file supaya peringatan soal pointer tidak terlewat. Flag -Wall sering menangkap tipe pointer yang salah sebelum program dijalankan.

Pointer butuh latihan, bukan hafalan. Semakin sering kamu baca pesan error compiler dan memeriksa alamat memori dengan printf, semakin cepat kamu terbiasa.

Pertanyaan yang Sering Diajukan

Apa bedanya pointer dan variabel biasa?

Variabel biasa menyimpan nilai, sedangkan pointer menyimpan alamat memori. Nilai pointer bisa kamu baca sebagai alamat dengan %p, dan isi di alamat itu diakses lewat operator *.

Kapan sebaiknya memakai pointer?

Saat sebuah fungsi perlu mengubah nilai di pemanggil, saat bekerja dengan array atau string, dan saat meminta memori secara dinamis. Untuk perhitungan sederhana yang tidak perlu mengubah nilai asli, variabel biasa sudah cukup.

Apakah pointer harus selalu diinisialisasi?

Ya. Pointer yang belum diisi berisi alamat acak, dan dereferensinya bisa membuat program crash. Isi dengan alamat variabel yang valid atau NULL sebelum dipakai.

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *