Search This Blog

Tuesday 6 September 2016

Pointer

Pada topik kali ini penulis ingin membahas sedikit mengenai pointer. Apa itu pointer? Pointer merupakan suatu nilai yang mana nilai tersebut berperan sebagai penunjuk lokasi suatu memori (dimana letak memori tersebut). Dan untuk menggunakan pointer sendiri kita menggunakan bantuan dari variabel, dimana variabel tersebut merupakan variabel pointer, hingga pada akhirnya variabel pointer tersebut biasa kita sebut dengan pointer. Jadi dengan kata lain variabel yang kita gunakan untuk program kali ini (yang disebut pointer) merupakan variabel pointer, dimana variabel tersebut hanya menjabat sebagai perwakilan/perantara bagaimana menggunakan pointer. Dan dengan variabel tersebutlah kita dapat menunjuk alamat suatu memori. Tapi tetap saja untuk menyebut variabel tersebut tidak harus variabel pointer, karena pada umumnya variabel tersebut disebut dengan pointer (tanpa kata variabel). Namun untuk pointer sendiri harus disesuaikan tipe datanya dengan variabel yang dituju. Misal Anda ingin mencari lokasi dari variabel A yang isinya tipe data numerik, maka variabel pointernya pun harus bertipe data numerik, dengan demikian pointer dapat menyelesaikan tugasnya. Untuk percetakannya sendiri, dalam mencetak alamat suatu memori dapat dilakukan dengan perintah cetak yang mengandung %p atau %x. Seperti printf("%x", p); kurang lebihnya penulisan dilakukan seperti demikian. Mari perhatikan contoh program berikut:

#include<stdio.h>
main(){
int G=97;
int *p;
p=&G;
printf("%x\n", p);
printf("\n%i", *p);
}

Pada contoh program diatas dapat diperhatikan bahwa yang pertama ialah mengenai tipe data, tipe data yang digunakan oleh variabel pointer dengan tipe data variabel yang akan ditunjuk lokasi memori dari nilai didalamnya memiliki tipe data yang sama yaitu integer. Selain itu ada tulisan p=&G; dimana pada perintah tersebut menunjukan bahwa p merupakan alamat dari variabel G. Dengan demikian dinyatakan bahwa nilai yang ada dalam variabel G tersebut akan ditunjuk lokasinya dengan perantara variabel pointer (p). Selain itu terdapat dalam contoh program diatas dua buah perintah cetak, dimana kedua perintah tersebut memiliki perbedaan. Apa perbedaannya? Seperti yang sudah disebutkan diatas, untuk mencetak alamat memori dapat menggunakan %p dan %x, maka pada perintah cetak pertama yang menggunakan %x merupakan cetak alamat memori, sedangkan pada perintah cetak yang kedua akan menghasilkan cetakan angka sebenarnya. Apa itu angka sebenarnya? Ialah angka yang ditunjuk, namun angka itu sendiri yang menjadi bahan perintahnya. Jadi yang tercetak nanti ialah angka 97 yang mana hasil copy dari variabel G. Dengan demikian ada sedikit penjelasan bahwa dalam penggunaan variabel pointer, terdapat perbedaan antara menggunakan karakter * dengan yang tanpa *.

Pointer sebenarnya memang untuk menunjuk alamat suatu memori, dan itu memang sudah jelas. Lalu mengapa dalam program diatas variabel pointer tersebut dapat digunakan seperti variabel biasa yang mana tugasnya untuk mencetak nilai dalam variabel, bukan untuk mencetak lokasi dari memorinya. Untuk hal tersebut perlu diingatkan kembali / ditegaskan kembali bahwa yang kita gunakan tersebut merupakan variabel pointer, dan pointer yang sebenarnya ialah penunjuk dari memorinya, jadi jika kita menggunakan variabel tersebut yang dideklarasikan sebagai variabel pointer ya bisa saja karena pada dasarnya ia hanyalah sebuah variabel, bukan pointer sesungguhnya, dan variabel tersebut hanya sebagai perantara untuk membantu dalam penggunaan pointer. Dan untuk sedikit tambahan, karena jika pada saat dicetak dengan ditambah karakter * akan menjadi variabel biasa dan tanpa * akan menjadi penunjuk alamat memori, maka ada satu hal yang perlu dijelaskan lagi disini. Dalam program tersebut bisa saja ditulis perintah cetak dengan printf("%i", p); dapat melihat perbedaannya? Perbedaannya ialah pada saat menggunakan %i dan variabelnya dijadikan sebagai variabel penunjuk alamat, maka %i tersebut akan menjadi patokan dimana yang akan dicetak ke layar merupakan alamat dari nilai dalam variabel yang alamat tersebut akan berbentuk decimal. Mengapa demikian? Karena integer sendiri merupakan bilangan decimal, sedangkan pada contoh program diatas pada saat penulis menggunakan %x, maka yang akan tercetak ke layar dalam bentuk hexadecimal. Silahkan jika ingin membuktikan, buat dua buah percetakan yang mana pada percetakan pertama menggunakan %i dan percetakan yang satunya menggunakan %x, lalu hitung apakah nilai decimal dengan hexa tersebut sama? Karena tidak mungkin berbeda dalam penunjukan alamat walau memang untuk percetakannya sendiri menggunakan tipe data yang berbeda. Namun sedikit catatan, bahwa untuk percetakan yang dimaksud ialah dalam program yang sama, karena jika untuk hexa dan decimalnya dibuat dalam komputer yang berbeda, maka hasilnya pun akan berbeda, memang bisa saja sama, namun kemungkinan tersebut terlalu tipis, mengingat lokasi memori dalam setiap komputer memiliki perbedaan.

Untuk pointer sendiri tidak hanya dapat digunakan sebagai percetakan biasa yang ditunjuk dari nilai awal yang tersedia, pointer sama dengan variabel lainnya yaitu dapat diberi perintah dan dijalankan sebagaimana biasanya. Seperti misal pointer untuk menunjuk alamat elemen array satu dimensi, itupun bisa dilakukan pada pointer, karena inti dari pointer sendiri yaitu penunjuk alamat, bagaimanapun programnya, selagi perintah yang digunakan jelas, maka pointer tersebut tidak akan bermasalah dalam menjalankan tugasnya. Ya sama saja dengan variabel lainnya, seperti dapat disisipkan dalam perulangan atau tugas lain misalnya, yang paling penting ialah kesesuaian antara tipe data akan nilai yang ditunjuk dengan tipe data pointer itu sendiri. Jadi bukan berarti pointer itu merupakan dunia baru dalam pemrograman c, karena pada dasarnya hanya sebuah variabel dengan ditambahkan karakter * yang dicetak dengan hexadecimal sebagai alamat memorinya. Ya jika dibandingkan dengan variabel biasa pun memang perbedaannya hanya dalam dua hal tersebut saja, antara * dengan tipe data (hexa). Memang ada yang menjadi pertanyaan untuk pointer ini, untuk apa kita mempelajari tentang pointer sedangkan pada pemrograman c sendiri kita biasanya hanya menggunakan variabel biasa dengan bantuan perulangan dan kondisi. Memang untuk program biasa kita akan jarang menggunakan pointer, karena memang untuk program biasa pointer jarang diperlukan, namun suatu saat ada suatu program yang memang sangat membutuhkan pointer, maka tidak ada salahnya untuk sedikit mempelajari (walau hanya cukup tau istilahnya). Oke untuk contoh penggunaan pointer dalam perulangan, perhatikan contoh program berikut, karena dalam contoh program yang satu ini pointer diletakan dalam perulangan

#include<stdio.h>
main(){
int G[3]={24,1,97}, i;
int *p;
p=G;
for(i=0; i<3; i++){
printf("%10x", p);
p++;
}
}
Dalam contoh program diatas tidak jauh berbeda dan memang dapat dikatakan sama saja dengan contoh program yang diatasnya, hanya saja pada contoh program yang satu ini terdapat sebuah perulangan. Secara deklarasi sendiri, karena memang ini merupakan array satu dimensi, maka deklarasi dan inisialisasinya dilakukan seperti pada umumnya array satu dimensi, serta untuk perulangannya pun memang bertujuan untuk mengindeks array satu dimensi tersebut. dan untuk deklarasi disini, memang hanya ditambah variabel i sebagai pembantu perulangannya. Serta untuk masalah perulangan, sudah jelas dalam perulangan tersebut dicetak alamat dari setiap elemen array satu dimensi yang dideklarasikan dan diberi nilai awal tadi. Yang paling penting dibahas disini ialah mengenai percetakan, jangan sampai salah menilai. Soal percetakan sendiri karena ini sebuah alamat maka akan berbeda setiap elemennya, namun perlu ditegaskan bahwa perbedaan disini terjadi karena lokasi memorinya yang berbeda, bukan karena nilai dari setiap elemen tersebut, karena berapapun nilainya, jika memang alamatnya disitu ya yang tercetak adalah lokasi tersebut dengan hexa. Jadi intinya jangan sampai keliru menganggap bahwa yang tercetak mengenai pointer ini bergantung kepada isi / nilai dalam variabelnya, karena ini bukanlah rumus yang menghitung dari setiap nilai yang terkandung dalam variabel, ini hanyalah penunjuk memori dimana letak memori akan nilai yang ditunjuk tersebut. soal perhitungan yang sempat dikatakan diatas, memang jika %i dengan %x akan berbeda, karena tipe datanya beda dan dapat dibuktikan dengan cara dihitung kesamaannya. Namun tetap saja hitungan tersebut tidak ada kaitannya dengan nilai yang ditunjuk, hitungan tersebut ialah sama, hanya untuk lokasi memori.

No comments:

Post a Comment