Pointer dalam Fungsi dan Alokasi Memori Dinamik


    Halo semua, berjumpa kembali dalam tutorial C++ dan kali ini kita akan melanjutkan tutorial mengenai Pointer. Pada tutorial Pointer sebelumnya kita telah belajar dasar - dasar cara menyimpan alamat variabel dan membuat program Pointer, kali ini untuk lebih dalamnya kita akan mempelajari cara membuat pointer dalam sebuah fungsi. Kita juga akan belajar bagaimana kita mengalokasikan memori secara dinamik sebagai tambahan. Pertama mari kita pelajari cara membuat fungsi dengan pointer di dalamnya.

Pointer sebagai Parameter Fungsi

Pada beberapa tutorial sebelumnya kita sudah mengetahui cara membuat sebuah fungsi dengan parameternya juga. Sekarang bagaimana jika kita mengganti parameter fungsi tersebut dengan variabel pointer? Sama seperti variabel lainnya, variabel pointer juga dapat dipakai sebagai parameter fungsi. Perhatikan contoh program berikut:

Pada program di atas, kedua fungsi menggunakan pointer sebagai parameternya. Fungsi get akan menerima data lalu disimpan di alamat yang ditunjuk oleh pointer a. Lalu fungsi kali, akan mengalikan dengan 5, data yang alamatnya disimpan oleh pointer z. Lalu akhirnya, pada int main( ) data yang disimpan akan dipanggil dengan memanggil alamat yang ditunjuk oleh pointer a dan z yaitu get(&angka) (baris 10) dan kali(&angka) (baris 12). Sehingga saat program dijalankan akan menghasilkan hasil seperti berikut:

Dengan cara yang sama seperti program di atas, array pointer juga dapat digunakan sebagai parameter fungsi. Lihatlah contoh program berikut.

    Pada program tersebut, fungsi jual dan fungsi total adalah fungsi yang menerima pointer array sebagai argumennya. Perhatikan, tidak terdapat perbedaan dalam deklarasi fungsi yang menggunakan parameter pointer saja dan fungsi yang menggunakan pointer array seperti pada deklarasi fungsi yang menggunakan variabel bukan pointer sebagai parameternya. Hal ini dikarenakan variabel pointer selalu menunjuk sebuah lokasi memori. Untuk kasus array, yang ditunjuk oleh pointer tetap sebuah lokasi memori tetapi dengan indeks yang berbeda (lihatlah Ilustrasi 4 pada tutorial "Dasar - Dasar Pointer pada C++")

    Pertama, program memanggil fungsi void jual pada baris 19 untuk proses perulangan sebanyak n kali. Pada program utama fungsi void jual dipanggil dengan jual (kwartal, 4) dengan arti n = 4 sehingga proses masukkan data akan diulang 4 kali. Selanjutnya program akan memanggil fungsi long total (baris 29) untuk menjumlahkan total masukkan data dari fungsi void jual, pointer *arr menunjuk pada variabel kwartal yang menjadi sebuah array dan menjumlahkan seluruh data[i] tersebut. Dan akhirnya keempat data itu akan dihitung rata - ratanya dengan rata = jum/4 sehingga kita telah mendapatkan hasil yang kita inginkan.

Alokasi Memori secara Dinamik

Saat menggunakan array untuk memproses sekelompok data, programmer diharuskan untuk memperkirakan banyaknya elemen array yang akan diproses sebelum program dipakai. Tidak jarang perkiraan itu kurang tepat, sebagai analogi misalkan seorang panitia memperkirakan banyaknya peserta seminar. Dapat saja terjadi perkiraan panitia terhadap ruangannya yang terlalu besar sehingga dalamnya terlihat kosong, atau terlalu kecil sehingga panitia harus terpaksa menolak peserta karena ruangan sudah penuh.

Untuk mengatasi masalah di atas, digunakanlah alokasi memori dinamik (dynamic memori allocation) dengan menggunakan pointer array. Banyaknya elemen array yang akan diproses tidak perlu diperkirakan oleh programmer, tetapi dapat ditentukan nanti saat program dijalankan. Hal ini dapat dilakukan dengan meminta alokasi memori dinamik dengan operator new. Sebagai contoh diketahui statement program seperti berikut:

    int *p;
    p = new int;

Pada program di atas, p adalah variabel pointer yang menunjuk data bertipe integer. Lalu p meminta tempat untuk menyimpan data integer. Dalam hal ini dialokasikan suatu tempat di memori untuk menyimpan data integer yang alamatnya ada pada variabel p. Setelah statement di atas maka dapat dilakukan statement berikut ini:

    *p = 35;

Yang artinya, nilai 35 akan disimpan pada lokasi memori yang ditunjuk p.

Perlu diingat, jika suatu variabel pointer telah dideklarasikan menunjuk suatu tipe data tertentu (atau lokasi memori telah ditentukan untuk menyimpan suatu tipe data tertentu) maka pointer tersebut tidak dapat digunakan untuk menunjuk tipe data lain (atau lokasi memori tersebut tidak dapat digunakan untuk menyimpan tipe data lain). Dengan demikian statement berikut ini, tidak dapat dijalankan karena *p hanya dapat menyimpan data bertipe integer.

    *p = 35.60    //salah tipe data tidak sama

Cara yang sama digunakan untuk meminta alokasi memori untuk menyimpan array yaitu:

    p = new int[100];

Setelah perintah di atas, akan dialokasikan tempat di memori untuk menyimpan 100 data integer.

Program C++ menyediakan sebagian memori yang dapat digunakan untuk alokasi memori secara dinamik. Yang menjadi masalah adalah jika banyak sekali statement yang meminta alokasi memori ini sehingga suatu saat habis, maka program akan menampilkan pesan kesalahan dan menghentikan program. Salah satu cara agar program dapat mengetahui apakah masih ada memori yang dapat dialokasikan adalah dengan memeriksa alamat yang disimpan oleh pointer setelah statement new dilaksanakan. Jika pointer berisi NULL maka artinya tidak ada memori yang dialokasikan. NULL adalah suatu konstanta yang menyatakan alamat 0 yang artinya alamat tersebut tidak dapat digunakan untuk menyimpan data. Pointer yang berisi NULL disebut null pointer.

Hal yang perlu diperhatikan dalam menggunakan memori yang dinamik ini adalah setelah program selesai menggunakan lokasi memori yang dinamik, maka lokasi memori tersebut harus dikembalikan (menghapus pointer yang menggunakannya) supaya lokasi memori tersebut dapat digunakan oleh statement yang lain. Perintah yang digunakan adalah:

        delete p;               // jika p adalah variabel tunggal
        delete [] p;           // jika p adalah variabel array
        p = NULL;             // p menjadi null pointer

Setelah perintah di atas, pointer p tidak menunjuk memori manapun. Coba perhatikan contoh program berikut ini. Program berikut ini akan memproses data penjualan selama beberapa hari. Banyaknya proses tidak diketahui sebelumnya dan akan ditentukan saat program dijalankan sehingga perlu digunakan alokasi memori secara dinamik.

Pada program di atas, setelah didapatkan alokasi memori untuk array, maka array dapat diproses seperti array statik yang sudah pernah dipelajari. Saat program dijalankan akan menghasilkan hasil seperti berikut:

Demikianlah kita selesai membahas seluruhnya mengenai pointer. Lihatlah tutorial sebelumnya untuk mempelajari kembali mengenai pointer kembali dari awal. Semoga tutorial ini dapat berguna bagi semuanya. Saya pamit dulu, Happy Learning semua, dan sampai jumpa kembali pada tutorial berikutnya.

Comments

Popular posts from this blog

Struktur Perulangan for dalam C++

Operator Pada Program C++

Tipe Data dalam C++