Rabu, 19 Oktober 2016

Perbedaan Antara Tipe Data Pointer dan Tipe Data Biasa Secara Fundamental


char nomor_rumah;
char *ptr_nomor_rumah;
short nomor_induk;
short *ptr_nomor_induk;

sizeof(nomor_rumah) --> 1
sizeof(ptr_nomor_rumah) --> 4
sizeof(nomor_induk) --> 2
sizeof(ptr_nomor_induk) --> 4


Selain keanehan kode di atas, tahukah kamu, semua tipe data dalam kelompok pointer pasti akan memiliki ukuran yang sama. Dan harus diketahui, dalam komputer 32-bit ukurannya 4 byte, dan 8 byte pada komputer 64-bit. Why?

Komputer 32-bit dapat mengakses alamat memori yang direpresentasikan dalam 4 byte (32-bit). Bentuk angka binernya seperti ini:
00000000000000000000000000000000 - 11111111111111111111111111111111

Kalau dikonversikan ke bentuk desimal, artinya komputer bisa mengakses antara 0 - 4.294.967.295 byte; Wow!
Itulah mengapa pointer selalu berukuran 4 byte. Agar pointer dapat mengakses data dari alamat manapun.

Sebenarnya semua tipe data variabel --baik pointer atau bukan pointer-- memiliki fungsi sama, yaitu menyimpan data. Ukurannya dapat bervariasi, tapi perlu diingat, alamat menaruh datanya tidak dapat di luar alamat maksimal yang bisa dijangkau komputer kita.

variable nomor_rumah dan varabel ptr_nomor_rumah sebenarnya sama-sama menyimpan data, hanya saja ptr_nomor_rumah menyimpan alamat memori dari variabel nomor_rumah, bukan nilainya. Dan seperti yang dikatakah sebelumnya, ukuran sebuah data dari kelompok pointer adalah 4 byte atau 8 byte. Setara dengan tipe long(32-bit) atau long long(64-bit).

Saat awal ingin mengakses pointer tersebut, kode berikut harus ada.
ptr_nomor_rumah = &nomor_rumah.

Tak perlu bingung dengan penjelasan dari buku, kita cukup mengatakan bahwa &nomor_rumah artinya 'alamat memori dari variabel nomor rumah'. Kita perlu melakukan ini karena saat awal program mulai, isi ptr_nomor_rumah = 0 (menunjuk ke alamat 0), alamat ini tidak boleh diakses. Jika tidak, program anda akan error. Jika tidak percaya coba saja!

Kita juga bisa mengambil alamat dari suatu data bertipe pointer.

char nomor_rumah;
char *ptr_nomor_rumah;
char **ptr_ptr_nomor_rumah;


sizeof(nomor_rumah) --> 1
sizeof(ptr_nomor_rumah) --> 4
sizeof(ptr_ptr_nomor_rumah) --> 4


Programmer yang masih awam dengan pointer tentu bingung. Tapi sekali lagi, arti dari '&X' adalah 'alamat dari X'. Dan sekali lagi saya tekankan, pointer juga variabel, tapi data yang disimpan adalah alamat memori.

char **ptr_ptr_nomor_rumah;
Kode di atas memiliki arti pointer ke pointer yang menunjuk char; atau jelasnya, pointer menuju data bertipe pointer yang menunjuk pada data bertipe char.

Jadi jangan bingung dengan pointer yang lebih kompleks, seperti char ***ptr; Berapapun jumlah '*'-nya, selalu ingat bahwa pointer juga data. dan pointer pun juga bisa menunjuk pointer yang lain. Mengapa? karena semua pointer adalah data.

Sebuah pointer menunjuk ke suatu alamat tertentu di memori. Oleh karena itu, jika kita tahu dimana alamat data yang akan diakses, kita bahkan bisa menentukan sendiri lokasinya secara langsung.
//data yang akan diakses ada di alamat 400000, misalnya.
char *char_yang_diakses = 400000;
*char_yang_diakses = 'a';


Atau bahkan bisa melakukan ini
*(400000) = 'a';

Hanya saja, satu hal yang perlu diketahui. Dengan sedikit tambahan cast.

char *char_yang_diakses = (char*) 400000;
*char_yang_diakses = 'a';

*((char*)400000) = 'a';


Apa itu cast ?
Sebenarnya kita bisa melakukan banyak hal dengan pointer. Hanya saja kompiler tdak terlalu pintar untuk membaca pikiran kita. Dia juga terlalu kawatir saat kita melakukan kesalahan dalam penulisan kode.

*(400000) = 'a';

Kita menganggap 400000 adalah alamat ke data bertipe char. Ya, kita akan menyimpan char 1 byte disana. Tapi kompiler sepertinya bingung, karena melihat 400000 sebagai angka biasa. Maka dari itu, kita harus menggunakan cast.
Load disqus comments

0 comments