Belajar Pemrograman C #11: Apa itu Pointer?

Bagi sebagian pemula.. pointer memang sulit dipahami.

Ini juga pernah saya alami dulu saat baru belajar C.

Tapi tenang saja..

Saya akan coba menjelaskannya dengan bahasa yang mudah dipahami.

Baiklah..

Mari kita mulai.

Apa itu Pointer?

Setiap variabel yang kita buat pada program akan memiliki alamat memori.

Alamat memori berfungsi untuk menentukan lokasi penyimpanan data pada memori (RAM).

Kadang alamat memori ini disebut reference atau referensi.

Coba perhatikan gambar ini:

alamat memori

Pada gambar ini, kita membuat dua variabel.. yakni umur dan tinggi.

Kedua variabel ini punya alamat memori masing-masing.

Variabel umur alamat memorinya adalah 0001, sedangkan tinggi alamat memorinya 0002.

Begitu seterusnya..

Pokoknya, setiap kita membuat variabel pasti akan punya alamat memori.

Nah, untuk melihat alamat memori yang digunakan pada variabel, kita bisa pakai simbol & (emphasis).

Contoh:

Coba perhatikan program berikut!

#include <stdio.h>

void main () {

   int  a;
   char b[10];

   printf("Alamat memori variabel a: %x\n", &a);
   printf("Alamat memori variabel b: %x\n", &b);

}

Pada program tersebut, kita menggunakan simbol & untuk mengambil alamat memori dari variabel a dan b. Lalu menggunakan format specifier %x untuk menampilkannya dalam bilangan heksadesimal.

Hasil outputnya:

Output program alamat memori

Lalu apa hubungannya alamat memori dengan pointer?

Mari kita bahas…

Pointer adalah sebuah variabel yang berisi alamat memori dari variabel yang lain. Pointer nantinya akan bisa mengakses data yang ada di suatu alamat memori.1

Kata kunci yang perlu kamu ingat:

“Pointer berisi alamat memori”

Cara Membuat Pointer

Pointer dibuat dengan menambahkan simbol * (asterik) di depan namanya, kemudian diisi dengan alamat memori yang akan digunakan sebagai referensi.

Contoh:

int *pointer1 = 00001;

Maka *pointer1 akan bisa mengakses data yang ada pada alamat memori 00001. Dengan kata lain, si *pointer1 akan menggunakan alamat 00001 sebagai referensinya.

Kita juga bisa membuat pointer, tanpa harus mengisinya langsung dengan alamat memori.

Contoh:

int *pointer_ku;

// atau bisa juga

int *pointer_ku = NULL;

Maka *pointer_ku akan menggunakan alamat memori 00000, alamat memori ini khusus untuk menyimpan data null atau data kosong.

Sekarang masalahnya:

Karena kita tidak bisa lihat daftar alamat memori secara langsung, kita akan kesulitan memberikan referensi alamat memori kepada pointer.

Belum lagi.. beda komputer beda juga alamat memorinya dan alamat memori akan selalu berubah setiap program dieksekusi.

Solusinya:

Kita harus mengambil alamat memori dari variabel yang lain.

Masih ingat caranya?

Ya, dengan menggunakan simbol &.

Coba perhatikan gambar ini:

pointer

Pada gambar ilustrasi ini, kita membuat tiga pointer yakni *pointer_umur, *p_tinggi, dan *pointer2.

Pointer *pointer_umur dan *pointer2 menggunakan referensi alamat memori 0001. Alamat memori ini merupakan alamat memori dari variabel umur.

Lalu, si pointer p_tinggi menggunakan alamat memori dari variabel tinggi.

Dengan begini..

Pointer akan bisa mengakses data yang tersimpan di dalam alamat memori tersebut.

Biar lebih jelas, mari kita coba dalam program.

Buatlah program baru dengan nama contoh_pointer.c, kemudian isi dengan kode berikut:

#include <stdio.h>

void main(){
    // membuat variabel
    int umur = 19;
    float tinggi = 175.6;

    // membuat pointer
    int *pointer_umur = &umur;
    int *pointer2 = &umur;
    float *p_tinggi = &tinggi;

    // mecetak alamat memori variabel
    printf("alamat memori variabel 'umur' = %d\n", &umur);
    printf("alamat memori variabel 'tinggi' = %d\n", &tinggi);
    // mencetak referensi alamat memori pointer
    printf("referensi alamat memori *pointer_umur = %d\n", pointer_umur);
    printf("referensi alamat memori *pointer2 = %d\n", pointer2);
    printf("referensi alamat memori *p_tinggi = %d\n", p_tinggi);
}

Setelah itu, coba compile dan jalankan.

Hasil outputnya:

contoh pointer

Lihatlah hasilnya..

Alamat memori yang digunakan sebagai referensi pada pointer akan sama dengan alamat memori dari variabel yang kita pakai sebagai referensi.

Oh iya, pointer juga punya alamat memorinya sendiri.

Coba perhatikan gambar ini:

alamat memori pointer

Sama seperti variabel biasa..

Jika ingin melihat alamat memori dari pointer, maka kita harus menggunakan simbol &.

Contoh:

#include <stdio.h>

void main(){
    // membuat variabel
    int umur = 19;
    float tinggi = 175.6;

    // membuat pointer
    int *pointer_umur = &umur;
    int *pointer2 = &umur;
    float *p_tinggi = &tinggi;

    // mecetak alamat memori variabel
    printf("alamat memori variabel 'umur' = %d\n", &umur);
    printf("alamat memori variabel 'tinggi' = %d\n", &tinggi);
    // mencetak referensi alamat memori pointer
    printf("referensi alamat memori *pointer_umur = %d\n", pointer_umur);
    printf("referensi alamat memori *pointer2 = %d\n", pointer2);
    printf("referensi alamat memori *p_tinggi = %d\n", p_tinggi);

    // mencetak alamat memori pointer
    printf("alamat memori *pointer_umur = %d\n", &pointer_umur);
    printf("alamat memori *pointer2 = %d\n", &pointer2);
    printf("alamat memori *p_tinggi = %d\n", &p_tinggi);
}

Hasilnya:

output alamat memori pointer

Apa bedanya alamat memori pointer dengan alamat referensi?

Alamat memori pointer adalah alamat memori yang digunakan untuk menyimpan pointer. Sedangkan alamat referensi adalah alamat yang akan menjadi referensi dari pointer.

Ingat:

“Pointer akan bisa mengakses isi data pada alamat referensi yang diberikannya”

Lah! bukannya nanti akan tambah boros memori.

Jika kita bisa menggunakan variabel biasa, ngapain pakai pointer?

Penggunaan pointer sebenarnya opsional, kamu boleh pakai.. boleh juga tidak.

Namun..

Pada kondisi tertentu, penggunaan pointer lebih optimal.

Nanti kita akan bahas ini lagi.

Sekarang, mari kita coba:

Mengakses data dengan Pointer

Sudah tahu cara mebuat pointer?

Bagus.

Sekarang kita akan mengakses data dengen pointer.

Caranya:

Ya, tinggal gunakan pointernya, hehe.

Contoh:

#include <stdio.h>

void main(){
    // membuat variabel score
    int score = 0;

    // membuat pointer dan referensikan dengan alamat
    // dari variabel score
    int *p_score = &score;

    // mengakses data variabel score dari pointer
    printf("isi *p_score = %d\n", *p_score);

    printf("isi score awal = %d\n", score);

    // mengubah data variabel score dari pointer
    *p_score = 5;

    // melihat isi variabel score
    printf("isi score setelah diubah = %d\n", score);
}

Hasilnya:

contoh akses data dengan pointer

Isi variabel score akan berubah, karena kita mengubahnya dari pointer.

Kapan saya harus menggunakan pointer?

Seperti yang saya katakan tadi, kita tidak harus selalu menggunakan pointer dalam program.

Namun, ada beberapa kasus tertentu yang menyarankan menggunakan pointer daripada cara biasa.

Karena terbukti, dengan pointer performa program akan lebih optimal.

Biar jelas..

Kita bahas dulu, mengapa pointer diciptakan?

Jadi zaman dulu, memori komputer itu sangat terbatas. Saat mengelola struktur data kompleks seperti data pada array, linked list, tree, dan sebagainya.. sering kali memakan banyak memori. 2

Oleh sebab itu, diciptakanlah pointer agar mudah membuat struktur data tersebut, dan tentunya lebih hemat memori.

Studi Kasus: Pointer untuk pass by reference

Petama kita akan coba menggunakan pointer untuk melakukan passing argumen berdasaran referensinya (pass by reference).

Contoh:

#include <stdio.h>

void add_score(int score){
    score = score + 5;
}

void main(){
    int score = 0;

    printf("score sebelum diubah: %d\n", score);
    add_score(score);
    printf("score setelah diubah: %d\n", score);
}

Pada program ini, kita membuat fungsi dengan nama add_score() untuk menambahkan nilai score sebanyak 5.

Tapi ketika dijalankan:

pass by value

Nilai variabel score tidak berubah, ia tetap bernilai 0.

Mengapa?

Ini karena kita melakukan pass by value, bukan pass by reference.

Variabel score kan dibuat di dalam fungsi main(), lalu ketika fungsi add_score() mencoba mengubah nilainya..

…maka perubahan hanya terjadi secara lokal di dalam fungsi add_score() saja.

Nggak percaya?

Coba buktikan dengan mengubah fungsi add_score() menjadi seperti ini:

#include <stdio.h>

void add_score(int score){
    score = score + 5;
    printf("Score dibuah ke %d\n", score);
}

void main(){
    int score = 0;

    printf("score sebelum diubah: %d\n", score);
    add_score(score);
    printf("score setelah diubah: %d\n", score);
}

Hasilnya:

add score

Benar kan yang saya katakan..

Nilai score pada fungsi add_score() sudah berubah menjadi 5, namun variabel score pada fungsi main() akan tetap bernilai 0.

Nah..

Di sinilah kita harus menggunakan pointer untuk melakukan pass-by-reference.

Sekarang, coba ubah kode programnya menjadi seperti ini:

#include <stdio.h>

void add_score(int *score){
    *score = *score + 5;
    printf("score dibuah ke: %d\n", *score);
}

void main(){
    int score = 0;

    printf("score sebelum diubah: %d\n", score);
    add_score(&score);
    printf("score setelah diubah: %d\n", score);
}

Karena argumen fugsi add_score() kita ubah menjadi pointer, maka kita harus memberikan alamat memori saat memanggilnya.

Maka hasilnya:

pass by reference

Setiap fungsi add_score() dipanggil atau dieksekusi, maka nilai variabel score akan bertambah 5.

Coba kita ubah menjadi seperti ini:

#include <stdio.h>

void add_score(int *score){
    *score = *score + 5;
    printf("score dibuah ke: %d\n", *score);
}

void main(){
    int score = 0;

    printf("score sebelum diubah: %d\n", score);
    add_score(&score);
    add_score(&score);
    add_score(&score);
    add_score(&score);
    add_score(&score);
    add_score(&score);
    printf("score setelah diubah: %d\n", score);
}

Hasilnya:

add score run

Studi Kasus: Pointer untuk Mengakses Array

Pointer juga sering digunakan untuk mengakses elemen array.

Contoh: pointer_array.c

#include <stdio.h>

void main(){
    printf("## Program Antrian CS ##\n");

    char no_antrian[5] = {'A', 'B', 'C', 'D', 'E'};

    // menggunakan pointer
    char *ptr_current = &no_antrian;

    for(int i = 0; i < 5; i++){
        printf("📢 Pelanggan dengan no antrian %c silahkan ke loket!\n", *ptr_current);
        printf("Saat ini CS sedang melayani: %c\n", *ptr_current);
        printf("-------- Tekan Enter untuk Next --------");
        getchar();
        ptr_current++;
    }

    printf("✅ Selesai");
}

Pada program ini, kita menggunakan ptr_current untuk mengakses elemen array. Saat pertama kali dibuat, pointer ptr_current akan mereferensi pada elemen pertama array.

Lalu pada perulangan dilakukan increment ptr_current++, maka pointer ini akan mereferensi ke elemen array sealnjutnya.

Hasilnya:

Apa Selanjutnya?

Kita sudah membahas konsep dasar pointer pada pemrograman C. Konsep ini harus kamu pahami, agar nanti ketemu pointer tidak bingung.

Intinya pointer bertugas menyimpan alamat memori dari sebuah variabel, lalu dengan pointer kita bisa memanipulasi nilai variabel tersebut.

Selanjutnya silahkan pelajari tentang:

Silahkan cek list tutorial pemrograman C untuk tutorial yang lainnya.


  1. https://en.wikipedia.org/wiki/Pointer_(computer_programming) ↩︎

  2. http://duramecho.com/ComputerInformation/WhyCPointers.html ↩︎