PERTEMUAN VI POINTER
6.1 Tujuan Praktikum Praktikan mengenal type data Pointer, mengerti tentang konsep dasar dari pointer, dapat mendeklarasikan pointer di Pascal serta dapat menggunakannya di dalam sebuah program. Mengerti tentang pembuatan array dengan menggunakan pointer, serta tahu cara mengalokasikan dan mende-alokasikan suatu variabel didalam sebuah program.
6.2 Teori Penunjang Pointer adalah suatu variabel yang menunjuk ke alamat memory variabel yang lainnya. Dengan menggunakan pointer banyak hal dapat dilakukan seperti melewatkan suatu variabel yang ada di dalam fungsi yang telah di bahas pada babbab sebelumnya. Suatu pointer bukan berisi dengan suatu nilai data seperti halnya pada variabel biasa, variabel pointer berisi dengan suatu alamat. Untuk mendeklarasikan variabel pointer kita menggunakan tanda asterik / bintang (*) didepan variabel yang di deklarasikan pada tipe data tertentu. Tanda ini juga dapat dipakai untuk mengakses nilai dari variabel yang telah ditunjuk. Untuk mendapatkan alamat dari variabel pointer kita menggunakan tanda &. Untuk lebih mengerti uraian diatas perhatikan ilustrasi berikut ini :
#include void main() { int *px, x, y; // mendeklarasikan variabel pointer px bertipe integer x = 1000; // memberikan nilai x sama dengan 1000 px = &x; // dengan statement ini variabel pointer sekarang menunjuk ke alamat variabel x y = *px; // mengakses variabel yang ditunjuk oleh pointer cout << px; // menampilkan isi dari variabel pointer px berupa alamat cout << endl; // ganti baris baru cout << y; // menampilkan isi dari variabel yang di tunjuk }
Hasil dari program diatas adalah : FFDD 1000
Dari ilustrasi diatas dapat kita lihat bahwa px (yang merupakan variabel pointer) berisi alamat dari variabel x. Sedangkan jika kita hendak mengakses nilai dari variabel yang ditunjuk oleh variabel pointer (nilai dari variabel x) maka kita gunakan tanda asterik di depan variabel pointer. Seandainya pada program diatas tidak terdapat pernyataan : px = &x; Namun terdapat pernyataan : y = *px; maka, y tidaklah berisi nilai x, sebab px belum diatur agar menunjuk variabel x. hal seperti ini dapat menyebabkan komputer menjadi hang karena pointer belum di inisialisasikan. Satu hal lagi yang perlu diperhatikan lagi jika kita menggunakan pointer ialah tipe variabel pointer dengan tipe data variabel yang ditunjuknya haruslah sama contohnya pada program diatas variabel pointer px bertipe sama dengan variabel yang ditunjuknya yaitu x, sama-sama bertipe integer.
Pointer dan Array Hubungan antara pointer dan array pada C/C++ sangatlah erat, sebab sesungguhnya array secara internal akan diterjemahkan dalam bentuk pointer. Untuk jelasnya perhatikan program berikut ini :
#include void main() { static int nilai[3] = {10,20,30 }; int *pnilai; pnilai = nilai; for(int i=0; i<3; i++) { cout << *(pnilai + i) << endl; } }
// pemberian nilai ke array nilai // mendeklarasikan variabel pointer pnilai // pnilai berisi alamat array
// tampilkan isi array melalui variabel pointer
Dari program diatas dapat dilihat bahwa pengaksesan elemen array dapat dilakukan melalui alamat memori pada variabel pointer. *(pnilai + i) sama hal nya dengan nilai[] pada array biasa. Output dari program diatas akan menghasilkan nilai 10, 20 dan 30. untuk array dua, tiga dan n dimensi pun dapat kita buat dengan menggunakan pointer. Contoh untuk array dengan dimensi dua pendeklarasiannya adalah : *(*(pnilai + i) + j)
Array dari pointer Suatu array bisa digunakan untuk menyimpan sejumlah pointer. Sebagai contoh untuk membuat array satu dimensi yang bertipe integer kita seklarasikan : int nilai[3]
dirubah menjadi
int *nilai
terdapat perbedaan diantara kedua statement diatas, pada array nilai[3] akan menyebabkan tiga buah tempat untuk nilai-nilai integer atau sebanyak 6 byte memori akan disiapkan untuk array ini (int = 2 byte dikali 3 tempat = 6 byte). Untuk array pointer, kompiler tidak secara otomatis menyiapkan tempat untuk nilai-nilainya, karena banyaknya nilai-nilai yang akan digunakan belum diketahui. Untuk mengatasi masalah ini, maka untuk menyiapkan sejumlah blok memori dapat digunakan cara alokasi dinamik (dynamic allocation). Cara alokasi dinamik ini menggunakan memori yang masih kosong di luar memori yang biasanya digunakan untuk data. Untuk menggunakan cara ini, perlu digunakan fungsi khusus didalam pointer yaitu menggunakan fungsi standar malloc() dengan prototypenya berada di header file stdlib.h. (ini hanya digunakan jika kita menggunakan bahasa C), jika kita menggunakan bahasa C++ maka fungsi standar yang digunakan ialah new. Contoh mengalokasikan suatu array dengan menggunakan fungsi-fungsi diatas adalah sebagai berikut : nilai = malloc(sizeof(int) * 3); // untuk mengalokasikan dengan C nilai = new int
// untuk mengalokasikan dengan C++
hasil dari pengalokasian diatas ialah suatu alamat yang menunjukkan byte pertama dari memori yang dialokasikan di heap. Jika alokasi memori ini gagal, bisa dikarenakan tidak mencukupinya memori pada heap, maka fungsi diatas akan menghasilkan nilai NULL.
Setelah kita mengalokasikan memori untuk array, ada baiknya jika kita menghapus / mende-alokasikan kembali array tersebut dari memori, sehingga ruang di memori heap dapat digunakan untuk keperluan yang lainnya. Untuk menghapus / mende-alokasikan sebuah array diperlukan sebuah fungsi standar free() dari header file stdlib.h untuk para pengguna bahasa C, jika kita menggunakan C++ kita menggunakan fungsi standar delete. Contohnya : free(nilai);
// mendealokasikan dengan bahasa C
delete [] nilai;
// mendealokasikan dengan bahasa C++
selanjutnya pengalokasian diatas dapat dengan mudah kita membentuk suatu struktur data link list maupun double link list dengan menggunakan bahasa C/C++. Berikut ini akan diberikan contoh program dengan menggunakan fungsi standar diatas (langsung dengan menggunakan C++) :
#include #include struct mhs { char npm[9]; char nama[25]; char alamat[30]; int nilai; }; void main() { mhs *pmhs; int n; clrscr(); cout << "PROGRAM DATA MAHASISWA" << endl; cout << "----------------------" << endl << endl; cout << "Masukkan Banyaknya Data : "; cin >> n; cout << endl; pmhs = new mhs[n]; for (int i=0; i> pmhs[i].nama; cout << "NPM Anda : "; cin >> pmhs[i].npm; cout << "Alamat Anda : "; cin >> pmhs[i].alamat; cout << "Nilai SBP Anda : "; cin >> pmhs[i].nilai; cout << endl; }
cout << "Tekan Sembarang tombol ... !"; getch(); clrscr(); cout << " Output Data Mahasiswa" << endl << endl; cout << "===========================================" << endl; cout << " No. Nama NPM Alamat Nilai" << endl; cout << "===========================================" << endl; for (i=0; i
#include void main() { int a, *b, **c; // mendeklarasikan variabel pointer a = 1000; // memberikan nilai a sama dengan 1000 b = &a; // dengan statement ini variabel pointer sekarang menunjuk ke alamat variabel a c = &b; // dengan statement ini variabel pointer sekarang menunjuk ke alamat variabel a cout << *b; // menampilkan isi dari variabel pointer b berupa alamat cout << endl; // ganti baris baru cout << **c; // menampilkan isi dari variabel pointer c } Hasil dari program diatas adalah : 1000 1000
Dari program diatas dapat disimpulkan bahwa dengan menggunakan pointer ke pointer, isi dari pointer yang terakhir merupaka alamat memori dari variabel pointer sesungguhnya. Pada contoh diatas, variabel b yang menunjuk ke variabel a ditunjuk kembali oleh variabel c sehingga nilai dari variabel c sebenarnya sama dengan variabel b dan variabel a.
6.3 Laporan Pendahuluan 1.
Pengertian Tree serta perbedaannya dengan Binary Tree.
2.
Jelaskan istilah-istilah pada Tree : daun, root, level, tinggi dan derajad.
3.
Sebutkan dan jelaskan jenis kunjungan yang terdapat pada binary tree.
4.
Bagaimana kunjungan secara Preorder, Inorder dan Postorder dari tree yang telah dibuat oleh PJ.
6.4 Materi Praktikum 1.
Memberikan penjelasan secara teoritis mengenai pointer, terutama pengertian, konsep dasar, cara pendeklariannya dalam bahasa C/C++.
2.
Penjelasan cara menerapkan pointer untuk membentuk struktur yang dinamis, melalui penggunaan fungsi-fungsi standar new dan delete.
3.
memberikan contoh cara pembuatan array pointer dan pointer ke pointer.
4.
Pemberian program-program sederhana pointer, diusahakan program yang menggunakan alokasi dinamik atau jika bisa langsung penerapan link list / double link list didalam program.
5.
Nilai K (Keterampilan) didapat jika praktikan melengkapi program tentang alokasi dinamik, seperti bagaimana cara menghapus sebuah variabel pointer dari memory, dll.
6.5 Laporan Akhir Buat Algoritma dari program yang dibuat sebelumnya (jika link list dapat lebih baik). Program dapat dilengkapi dengan penggunaan pointer ke pointer atau dapat juga menggunakan array pointer untuk yang dua dimensi.