Langsung ke konten utama

Pointer - Algoritma Pemrograman 2

Pointer pada C++

1.   Alamat Dan Pointer
Pointer adalah variabel yang berisi  alamat dari variabel yang memiliki nilai tertentu. Konsep dari pointer sebenarnya tidak sekompleks yang diduga oleh beberapa orang. Pointer sesungguhnya berisi alamat suatu data, bukan data sebagaimana pada variable yang telah dikenal.
Seperti diketahui, setiap byte di dalam memori computer memiliki alamat.  Alamat memori dimulai dari 0. Didalam memori inilah variable disimpan.  Namun, tentu saja program tidak perlu menyebutkan alamat suatu variable secara eksplisit. Pada saat program dimuat didalam memori, variable akan diletakkan dengan sendirinya pada alamat tertentu.
Suatu pointer didalam program dimaksudkan untuk menunjuk ke suatu alamat memori. Sebagai contoh pada gambar di bawah ini, kalau pint adalah pointer, dan vint adalah variable yang terletak didalam memori beralamat 0x28fee8, pointer  pint dapat diatur agar menunjuk ke variable vint.

2.   Mengetahui Alamat Suatu Variabel
Alamat suatu variable dapat diketahui dengan mudah. Caranya ialah dengan menambahkan operator alamat, berupa simbol &, didepan nama variable. Dengan mengirimkan ke cout, alamat suatu variable akan ditampilkan ke layar.
Program alifbata.cpp memperlihatkan adanya tiga deklarasi variable bernama alif, ba dan ta. Alamat ketiga variable ini ditampilkan melalui satu cout. Alamat diperoleh dengan menambahkan tanda & didepan nama variable.
Contoh-1
Input :
Output :

3.   Deklarasi Variabel Pointer
Suatu variable pointer dideklarasikan dengan bentuk seperti berikut :
tipe_data nama_variabel
Dalam hal ini:
·         tipe_data dapat berupa sembarang tipe seperti halnya pada deklarasi variable bukan pointer;
·         nama_variabel adalah nama variable pointer
Beberapa contoh deklarasi variable pointer :
     int *pint; //pointer ke int
     char *pch; //pointer ke char
     float *pfl; //pointer ke float
Beberapa variable pointer dapat dideklarasikan dengan sebuah pernyataan.
 Contoh :
     char *pch1, pch2;
Mendeklarasikan :
·         pch1 : pointer yang menunjuk ke data bertipe char.
·         Pch2 : pointer yang menunjuk ke data bertipe char.

4.   Mengisi Variable Pointer
Supaya suatu variabel pointer menunjuk ke variabel lain, mula-mula harus diisi dengan alamat variabel yang hendak ditunjuk. Sebagai contoh, terdapat deklarasi seperti berikut :
Int vint = 35;
Int *pint;
Variabel pointer pint dapat diatur agar menunjuk ke vint dengan cara seperti berikut :
   pint = &vint;
Pernyataan diatas berarti : *pint diisi dengan alamat vint”. Operator & menyatakan “alamat dari”. Sekarang, lihatlah program berikut yang mendeklarasikan variabel pointer, mengisinya dengan alamat suatu variabel, dan menampilkan isi pointer.
Contoh-2
Input :
Output :
Pada contoh diatas,
                        cout<<"pint = "<<pint<<endl;
terlihat menampilkan isi pointer itu sendiri, bukan isi variabel vint.

5.   Mengakses Nilai Yang Ditunjuk Pointer
Berdasarkan contoh pada program sebelumnya, alamat vint dapat diakses melalui pint setelah pernyataan : pint =&vint; dijalankan. Persoalan berikutnya adalah, “Bagaimana nilai vint dapat diakses melalui pint ?”. Nah hal itu dilaksanakan dengan melibatkan operator “tak langsung”. Operator ini berupa symbol * dan diletakkan didepan nama variabel pointer.
 Contoh : *pint berarti “nilai yang ditunjuk oleh pint”.
Contoh-3
Input :
Output :
Hasil diatas menunjukkan bahwa pengaksesan terhadap vint dapat dilakukan melalui *pint. Program berikut menunjukkan , nilai vint diubah melalui pint :
Contoh-4
Input :
Output :

Pada program sebelumnya  diberikan contoh beberapa variabel pointer yang menunjuk ke tipe data tertentu. Namun, sebenarnya dimungkinkan untuk membuat pointer yang tidak bertipe. Caranya adalah dengan meletakkan kunci void pada bagian penentu tipe pointer. Contoh :
            void *ptr;
Merupakan pernyataan untuk mendeklarasikan ptr sebagai variabel pointer void. Suatu pointer void adalah pointer yang dapat menunjuk keseberang tipe data. Sebagai contoh, anda dapat mengatur agar pointer ini menunjuk ke tipe data int, tetapi di saat lain diperlukan untuk menunjuk data bertipe float.
Berikut program yang menunjukkan operasi pada pointer void :
Contoh-5
Input :
Output :
Tampak bahwa variable pointer ptr dapat menunjuk ke tipe int atau float. Seandainya terdapat deklarasi
int *ptr;
float vfl = 51.5;
Penugasan seperti
                             ptr = &vfl;
Tidak diperkenankan. Penyebabnya, tipe data yang ditunjuk oleh ptr dan tipe data vfl berbeda. Berbeda halnya kalau ptr dideklarasikan sebagai :
void *ptr;
pada program diatas, pernyataan :
cout<<"Nilai yang ditunjuk ptr = "
        <<*(int *) ptr<<endl;
cout<<"Nilai yang ditunjuk ptr = "
        <<*(float *) ptr<<endl;
mungkin kelihatan aneh. Bentuk seperti :
                             *(int *) ptr
            *(float *)
Perlu diberikan. Hal ini disebabkan C++ tidak tahu maksud seperti: *ptr mengingat ptr adalah pointer void. Oleh karena itu, anda harus menyebutkan tipe data yang akan diakses melalui type cast. Contoh : *(int *)ptr menyatakan bahwa data yang diakses bertipe int cara seperti ini berlaku tidak saja kalau anda bermaksud mengambil nilai yang ditunjuk oleh ptr, tetapi juga kalau mau mengubahnya.
Berikut program yang menunjukkan pengubahan variabel yang ditunjuk oleh pointer void.
Contoh-6
Input :
Output :

Pointer dan array mempunyai hubungan yang dekat. Secara internal, array juga menyatakan alamat. Sebagai contoh dideklarasikan : int tgl_lahir [] = {24,6,1965}; dan int *ptgl;
Agar ptgl menunjuk ke array, diperlukan pernyataan berupa : ptgl = tgl_lahir;
Perhatikan dengan seksama pernyataan diatas. Tidak ada tanda & didepan tgl_lahir.  Padahal, beberapa contoh sebelumnya menggunakan format : ptr = &variabel ,bila variabel bukan merupakan array. Hal ini disebabkan nama array sebenarnya sudah menyatakan alamat. Oleh karena itu tanda & tidak diperlukan.
Input :
Output :
Setelah penugasan : ptgl = tgl_lahir;
Maka ptgl akan menunjuk ke elemen pertama array tgl_lahir. Itulah sebabnya :
cout<<"Nilai yang ditunjuk ptgl = "
       <<*ptgl<<endl;
Menampilkan nilai pertama pada tgl_lahir. Seluruh elemen array tgl_lahir dapat ditampilkan melalui pernyataan :
for (i=0; i<3); i++)
cout<<" "<<tgl_lahir[i]<<endl;
bentuk seperti tgl_lahir[i] dapat diubah dalam notasi seperti berikut :
for (i=0; i<3); i++)
cout<<" "<<*(tgl_lahir + 1)<<endl;
Input :
Output :
Perlu diketahui, pada notasi seperti : *(tgl_lahir + 1) ungkapan tersebut tidak berarti  tgl_lahir + (1 byte). Namun, C++ dengan bijaksana dapat mengetahui bahwa tgl_lahir + 1  berarti : “tgl_lahir +(ukuran tipe elemen tgl_lahir)* l”
Seluruh elemen array juga dapat diakses melalui variabel pointer. Salah satu caranya adalah dengan mengubah isi variabel pointer sesuai dengan alamat setiap elemen array.
Input :
Output :
Tampak bahwa sebelum for,ptgl berisi alamat tgl_array. Kemudian, secara berurutan alamat yang ditunjuk ptgl dinaikkan sebesar 4 (sesuai dengan data int).

8.   Pointer Dan String
Input :
Output :
Pada contoh diatas : char *ptokoh = "GatotKaca"; akan menyebabkan C++ :
·         Mengalokasikan ptokoh sebagai variabel pointer yang merujuk ke data bertipe char dan menempatkan kostanta string “Gatotkaca” kesuatu lokasi di memori komputer;
·         Kemudian ptokoh akan menunjuk kelokasi string “Gatotkaca”.
Pernyataan diatas menyerupai pernyataan : char tokoh[] = “Gatotkaca”; perbedaannya :
·         ptokoh adalah pointer yang dengan mudah dapat diatur agar menunjuk ke data string;
·         ptokoh adalah array yang menyatakan alamat yang konstan, tidak dapat diubah. Bagian yang dapat diubah adalah elemen array-nya.
Perbedaanya ditunjukkan pada program berikut :
Input :
Output :
Tampak bahwa pointer dengan mudah dapat diubah (misalnya ptokoh++). Dengan cara seperti itu, kalau semula ptokoh menunjuk “Gatotkaca”, kini menunjuk “atotkaca

9.   Array Pointer
Satu array bisa digunakan untuk menyimpan sejumlah pointer. Contoh : string *namahari[7]; merupakan pernyataan untuk mendeklarasikan array namahari yang berisi tujuh elemen berupa pointer. Pointer tersebut menunjuk ke data bertipe string. Program berikut memperlihatkan contoh pembuatan array pointer dan cara menginisialisasinya. Kemudian, nilai yang ditunjuk oleh elemen-elemen pointer ini di tampilkan ke layar.
Input :
Output :
Pada contoh diatas, setiap nilai yang ditunjuk oleh elemen pointer array namahari dapat diakses melalui namahari[i]. Program diatas memperlihatkan array pointer setelah perintah berikut dijalankan:
for (i=0; i<7; i++)
phari[i] = &namahari[i];

10.   Pointer Menunjuk Pointer
Untuk membentuk rantai pointer, diperlukan deklarasi seperti berikut :
int var_x = 273;
int *ptr1;  //satu tanda * didepan ptr1
int **ptr2; // dua tanda * didepan ptr2
pada deklarasi diatas :
·         Var_x adalah variabel bertipe int.
·         Ptr1 adalah variabel pointer yang menunjuk ke data bertipe ptr1.
·         Ptr2 adalah variabel pointer yang menujuk ke pointer int.
Agar ptr1 menunjuk ke variabel var_x, perintah yang diperlukan berupa :
Ptr1=var_x;
Supaya ptr2 menunjuk ke ptr1, diperlukan perintah berupa :
Ptr2 = &ptr1;
Contoh program yang memberikan gambaran pengaksesan nilai pada var_x melalui pointer ptr1 dan ptr2 adalah berikut :
Input :
 Output :

11.   Pointer Dan Fungsi
a.   Pointer  Sebagai Argumen Fungsi
Input :
Output :
Dengan menuliskan & didepan argumen pada pendefinisian fungsi (dan juga tentu saja pada prototype fungsi), nilai argument dapat diubah didalam fungsi. Hal serupa dapat diimpelementasikan dengan pointer.
Input :
Output :
Hasil eksekusi dari program diatas sama seperti pada program sebelumnya.
Perbedaanya adalah :
·         Fungsi ubah_nilai() didefinisikan dengan judul fungsi berupa : void ubah_nilai (int *x)
·         Pada saat fungsi dipanggil ,argumen perlu  ditulis dengan awalan & (perhatikan : &pinokio);
·         Prototype fungsi disesuaikan dengan definisi fungsi : void ubah_nilai (int *x);
·         Didalam fungsi ubah_nilai(), tanda * perlu diberikan didepan nama argument *x = 95;

b.   Pointer Sebagai Keluaran Fungsi
Suatu fungsi dapat dibuat agar keluarannya berupa pointer. Sebagai contoh, suatu fungsi menghasilkan  nilai balik berupa pointer yang merujuk ke string nama bulan.
Input :
Output :

c.   String Sebagai Argumen
Argument berupa string biasa dinyatakan dengan pointer (pointer yang menunjuk ke tipe char) dan bukan menggunakan array karakter. Contoh :
Void strkiri(char hasil[], char st[],int n)
{
Int I;
For (i=0; i<n; i++)
Hasil[i] = st [i];
Hasil[i] = ‘\0’ ; //karakter null
}
Bagian seperti char hasil[] (argumen string) biasa dinyatakan dalam bentuk : char *hasil(pointer ke char)
Definisi fungsi berikut seperti diatas dapat ditulis menjadi :
Void strkiri(char hasil[], char st[],int n)
{
     Int I;
     For (i=0; i<n; i++)
     *(hasil+1) = *(st +1);
     *(hasil+1) = ‘\0’ ; //karakter null
}

Pointer konstan berlaku seperti variabel konstan (konstanta bernama). Isinya tidak dapat diubah. Contoh : char bahasa[] = “C++”; char *const ptr = bahasa;
Pada contoh diatas, ptr berlaku sebagai pointer konstan yang menunjuk ke bahasa.
Input :
Output :
·         Isi yang ditunjuk ptr bisa diubah.
Input :
Output :
·         Program untuk menampilkan alamat suatu variabel
Input :
Output :



Sumber :
Saputri, S. (2016). Modul Alpro 2-1. Pointer, 1-32.

Komentar

Postingan populer dari blog ini

Graf (Graph) dan Pohon (Tree) - Algoritma Pemrograman 2

Graf ( Graph ) dan Pohon (Tree) pada C++ 1). Definisi Graph Graf adalah kumpulan noktah (simpul) di dalam bidang dua dimensi yang dihubungkan dengan sekumpulan garis (sisi). Graph dapat digunakan untuk merepresentasikan objek-objek diskrit dan hubungan antara objek-objek tersebut. Representasi visual dari graph adalah dengan menyatakan objek sebagai noktah, bulatan atau titik ( Vertex ), sedangkan hubungan antara objek dinyatakan dengan garis ( Edge ). G = (V, E) Dimana : G = Graph V = Simpul atau Vertex , atau Node, atau Titik E = Busur atau Edge , atau arc Graf merupakan suatu cabang ilmu yang memiliki banyak terapan. Banyak sekali struktur yang bisa direpresentasikan dengan graf, dan banyak masalah yang bisa diselesaikan dengan bantuan graf. Seringkali graf digunakan untuk merepresentasikan suaru jaringan. Misalkan jaringan jalan raya dimodelkan graf dengan kota sebagai simpul ( vertex/node ) dan jalan yang menghubungkan setiap kotanya sebagai sisi ( edge ) y...

Akses File - Algoritma Pemrograman

AKSES FILE PADA C++ KATA PENGANTAR Puji dan syukur penulis panjatkan kehadirat Allah SWT. Karena dengan Rahmat dan Karunia-Nya, penulis dapat menyelesaikan pembuatan artikel dengan judul Akses File hingga selesai . Dengan diberikannya tugas pembuatan artikel di sebuah blog, mahasiswa diharapkan mampu mempelajari lebih banyak lagi materi mengenai Akses File dan mampu menyelesaikan tugas mata kuliah algoritma pemrograman yang diberikan oleh dosen . Semoga dengan pembuatan artikel ini dapat bermanfaat khususnya bagi penulis selaku mahasiswa dan umumnya bagi kita semua. Selanjutnya penulis, merasa bahwa artikel Akses File ini jauh dari kesempurnaan. Oleh sebab itu, penulis mohon maaf sebesar-besarnya apabila dalam penyusunan artikel ini terdapat banyak kesalahan, baik dalam segi penulisan, pembahasan, dan penyusunannya yang kurang rapi. Maka dari itu besar harapan penulis semoga artikel ini dapat bermanfaat bagi penulis dan orang lain. 8 Desember 2018 BAB...

RELASI - MATEMATIKA DISKRIT

TI Politala Matdis 1B KATA PENGANTAR Puji dan syukur penulis panjatkan kehadirat Allah SWT. Karena dengan Rahmat dan Karunia-Nya, penulis dapat menyelesaikan pembuatan artikel dengan judul “Relasi” hingga selesai . Dengan diberikannya tugas pembuatan artikel di sebuah blog, mahasiswa diharapkan mampu mempelajari lebih banyak lagi materi mengenai relasi, dan mampu menyelesaikan tugas mata kuliah matematika diskrit yang diberikan oleh dosen . Semoga dengan pembuatan artikel ini dapat bermanfaat khususnya bagi penulis selaku mahasiswa dan umumnya bagi kita semua. Selanjutnya penulis, merasa bahwa artikel relasi ini jauh dari kesempurnaan. Oleh sebab itu, penulis mohon maaf sebesar-besarnya apabila dalam penyusunan artikel ini terdapat banyak kesalahan, baik dalam segi penulisan, pembahasan, dan penyusunannya yang kurang rapi. Maka dari itu besar harapan penulis semoga artikel ini dapat bermanfaat bagi penulis dan orang lain. 13 Oktober 2018     ...