0% menganggap dokumen ini bermanfaat (0 suara)
116 tayangan13 halaman

Deskripsi Stack

Dokumen tersebut membahas tentang struktur data dan pointer dalam bahasa C dan C++. Secara ringkas, struktur data memungkinkan pengelompokan variabel dengan tipe data yang berbeda menjadi satu kesatuan, sementara pointer digunakan untuk mengacu kepada objek lain di memori dan memungkinkan pembuatan struktur data dinamis seperti linked list.

Diunggah oleh

edi_kampret
Hak Cipta
© Attribution Non-Commercial (BY-NC)
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai DOCX, PDF, TXT atau baca online di Scribd
0% menganggap dokumen ini bermanfaat (0 suara)
116 tayangan13 halaman

Deskripsi Stack

Dokumen tersebut membahas tentang struktur data dan pointer dalam bahasa C dan C++. Secara ringkas, struktur data memungkinkan pengelompokan variabel dengan tipe data yang berbeda menjadi satu kesatuan, sementara pointer digunakan untuk mengacu kepada objek lain di memori dan memungkinkan pembuatan struktur data dinamis seperti linked list.

Diunggah oleh

edi_kampret
Hak Cipta
© Attribution Non-Commercial (BY-NC)
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai DOCX, PDF, TXT atau baca online di Scribd
Anda di halaman 1/ 13

Struktur Data

Nama : I Putu Agus Sumayasa


ID : 2009.3002.02.001
Kls : ITA
Array & Struct
Definisi Struktur (struct) sendiri adalah kumpulan dari variabel yang dinyatakan dengan
sebuah nama , dengan sifat setiap variabel dapat memiliki tipe yang berlainan.
Dalam pemrograman C++, jika kita membuat suatu program yang memerlukan berbagai tipe
data yang akan digunakan. Tentunya dengan nama variable yang banyak pula. Dalam program yang
sederhana, jika kita manggunakan sedikit variable tentu tidak jadi masalah. Akan tetapi jika kita akan
membuat sebuah program yang lebih kompleks, dengan berbagai macam nama dan tipe variable
dalam pendeklarasianya. Dengan struct, kita bisa mengelompokkan berbagai nama dan tipe variable
tersebut sesuai dengan kelompoknya. Hal ini tentunya bisa berguna untuk memudahkan dalam
mengelompokkan sebuah variable. Sebagai contoh umum, ada terdapat berbagai nama variable :
nama, npm, alamat, dll. Variabel – variable tersebut dapat kita kelompokkan menjadi satu dengan
nama data_mahasiswa. Kemudian jika terdapat variable mata_kuliah, nilai, sks, kelas, dll dapat kita
kelompokkan menjadi satu dengan nama krs. Itulah sebagian gambaran umum tentang struct.
Dalam mendeklarasikan struct, ada beberapa cara penulisan yang biasa digunakan.
Pertama :
struct nama_struct {
tipe_data_1 nama_var_1;
tipe_data_2 nama_var_2;
tipe_data_3 nama_var_3;
……
};
Yang kedua adalah dengan deklarasi menggunakan typedef.
typedef struct {
tipe_data_1 nama_var_1;
..
.
tipe_data_n nama_var_n;
} nama_struct;
Kemudian untuk mendeklarasikan sebuah variable dengan tipe data struct yang telah dibuat
sebelumnya adalah :
struct tipe_struct nama_variabel;
Jika pendeklarasian struct sebelumnya menggunakan typedef, maka untuk mendeklarasikan sebuah
variable dengan tipe data struct adalah :
tipe_struct nama_variabel;
Dan untuk mengakses sebuah struct adalah dengan menggunakan operator titik (.)
nama_var_struct . nama_var_elemen;
NESTED STRUCT
Di dalam sebuah struct dapat dimungkinkan terdapat sebuah struct lagi. Jadi hal ini dapat
diartikan struct di dalam struct. Hampir mirip nested loop, yaitu for di dalam for.
Contoh :
struct tanggal {
int hari;
int bulan;
int tahun;
};
struct karyawan {
char NIP [10];
char nama [20];
struct tanggal tgl_masuk;
float gaji;
};

STRUCT OF ARRAY
Sebuah struct yang di dalamnya tedapat variable dengan tipe data array.
Contoh :
struct data {
char nama[20];
char alamat[100];
};

ARRAY OF STRUCT
Sebuah array yang setiap data elemennya bertipe struct. Umumnya dipakai untuk menyimpan
object data yang terstruktur, misal: data mahasiswa, karyawan, buku, barang, dsb.
Contoh :
typedef struct {
char npm [10];
char nama [20];
char alamat [30];
unsigned angkatan;
float ipk;
} mahasiswa ;
mahasiswa data[100];
// deklarasi var, menyiapkan 100 data dengan tipe data mahasiswa (struct yang telah dibuat
sebelumnya).

Stack
Salah satu konsep yang efektif untuk menyimpan dan mengambil data adalah "terakhir masuk
sebagai yang pertama keluar" (Last In First Out / LIFO). Dengan konsep ini, pengambilan data akan
berkebalikan urutannya dengan penyimpanan data.
Stack adalah sebuah kumpulan data dimana data yang diletakkan di atas data yang lain.
Dengan demikian stack adalah struktur data yang menggunakan konsep LIFO. Dengan demikian,
elemen terakhir yang disimpan dalam stack menjadi elemen pertama yang diambil. Dalam proses
komputasi, untuk meletakkan sebuah elemen pada bagian atas dari stack, maka kita melakukan push.
Dan untuk memindahkan dari tempat yang atas tersebut, kita melakukan pop.
Untuk menjelaskan pengertian diatas kita mengambil contoh sebagai berikut. Misalnya kita
mempunyai dua buah kotak yang kita tumpuk, sehingga kotak kita letakkan di atas kotak yang lain.
Jika kemudian stack dua buah kotak tersebut kita tambah dengan kotak ketiga dan seterusnya, maka
akan kita peroleh sebuah stack kotak, yang terdiri dari N kotak.
Secara sederhana, sebuah stack bisa kita ilustrasikan seperti pada gambar 4.1 di bawah ini.
Dari gambar di bawah ini, kita bisa mengatakan bahwa kotak B ada di atas kotak A dan ada di bawah
kotak C. Dari gambar tersebut kita dapat melihat bahwa kita hanya bisa menambah atau mengambil
sebuah kotak lewat satu ujung, yaitu ujung bagian atas. Nampak pula bahwa stack merupakan
kumpulan data yang sifatnya dinamis, artinya kita bisa menambah atau mengambil data darinya.
PENYAJIAN STACK
Ada beberapa cara untuk menyajikan sebuah stack tergantung pada permasalahan yang akan
kita selesaikan. Dalam bab ini kita akan menggunakan cara yang paling sederhana, tipe data yang
sudah kita kenal, yaitu array. Kita dapat menggunakan array untuk menyajikan sebuah stack, dengan
anggapan bahwa banyaknya elemen maksimum dari stack tersebut tidak akan melebihi batas
maksimum banyaknya elemen dalam array.
Pada saat ukuran stack, kalau kita teruskan menambah data lagi, akan terjadi overflow.
Dengan demikian perlu data tambahan untuk mencatat posisi ujung stack. Dengan kebutuhan seperti
ini, kita dapat menyajikan stack dengan menggunakan tipe data struktur (struct) yang terdiri dari dua
field. Field pertama bertipe array untuk menyimpan elemen stack, medan kedua bertipe integer untuk
mencatat posisi ujung stack. Dengan demikian kita mendeklarasikan stack sebagai berikut:

#define MAXSTACK 100


typedef int ItemType;
/* Definisi struktur stack */
typedef struct
{
int Item[MAXSTACK]; /* Array yang berisi data tumpukan */
int Count; /* menunjukkan indeks data paling atas dari stack */
}Stack;

OPERASI PADA STACK


Operasi-operasi Dasar pada stack adalah sebagai berikut:
1. Operasi menciptakan T sebagai stack kosong
void InitializeStack(Stack *S)
{
S->Count = 0;
}

2. Fungsi yang melakukan pengecekan apakah stack dalam kondisi kosong


int Empty(Stack *S)
{
return (S->Count == 0);
}
3. Fungsi yang melakukan pengecekan apakah stack dalam kondisi penuh
int Full(Stack *S)
{
return (S->Count == MAXSTACK);
}

4. Operasi menyisipkan elemen x ke stack T dan mengembalikan stack baru


Void push (ItemType x, Stack *S)
{
If (Full)
Printf(“Stack penuh ! Data tidak dapat masuk !”);
Else
{
S->Item[S->Count]=x;
++ (S->count);
}
}

5. Operasi mengambil elemen puncak stack T, (pop(T,x))


void Pop(Stack *S, ItemType *x)
{
if (Empty)//stack kosong
printf("Stack masih kosong!");
else
{
--(S->Count);
*x = S->Item[S->Count];
S->Item[S->Count]=0;
}
}

Operasi Push
Dari implementasi operasi push di atas dapat dijelaskan sebagai berikut: Fungsi tersebut
menyiapkan tempat untuk x yang akan dipush ke dalam tumpukan, yaitu dengan menambah nilai S-
>Count dengan 1 dan kemudian menyisipkan x ke dalam S->Item. Cara memanggil prosedur di atas
adalah sebagai berikut:
x = 5;
Push(x, &tum);

Operasi Pop
Operasi pop adalah operasi untuk menghapus elemen yang terletak pada posisi paling atas
dari sebuah tumpukan. Cara pemanggilan satu data prosedur pop di atas adalah sebagai berikut:
/* mengambil satu data dari tumpukan */
hasil = Pop(&tum);
printf("Data %d hasil pengambilan dari tumpukan : ",hasil);

POINTER
Penjelasan tentang pointer pointer adalah built-in type di C dan C++, dimana C++ mengambil
konsep pointer dari C. Pointer sebenarnya sangat terkait dengan “Abstract C Machine”, yaitu model
mesin abstrak dimana program C bekerja. Abstract C Machine adalah mesin abstrak dimana mesin
tersebut memiliki prosesor untuk menginterpretasikan stream of instruction, dan addressable memory
yang terbagi kedalam 3 bagian : automatic memory, static memory dan free memory. Addressable
memory adalah memory yang konten-nya dapat diambil jika diketahui alamatnya. Lebih jauh lagi,
terdapat asumsi bahwa konten memori dapat di ambil dengan waktu konstan, tidak peduli berapa nilai
alamat.Hal ini disebut dengan Random Access Memory. — Penggunaan Awal Pointer Jika variabel
merupakan isi memori, dan untuk mengakses isi memori tersebut diperlukan address, lalu bagaimana
cara kita mengetahui alamat dari suatu variabel ? Jawabannya adalah : untuk kebanyakan kasus kita
sama sekali tidak perlu tahu alamat dari sebuah variabel. Untuk mengakses sebuah variabel kita hanya
perlu nama dari variabel tersebut.
Tugas kompiler lah yang mentranslasikan nama ke alamat mesin yang diperlukan oleh
komputer. Akan tetapi terdapat beberapa kasus dimana kita tidak mungkin memberi nama pada
sebuah entitas di program kita. Hal ini terjadi terutama saat kita menggunakan data struktur dinamis
seperti linked list, resizeable array, tree dan lain sebagainya. Hal ini karena kita tidak mungkin
memberi nama terhadap entitas yang mungkin ada atau tidak ada. Struktur seperti linked list hampir
mustahil dibuat tanpa pointer tanpa harus mendefinisikan LISP-like list. Inilah awal mula penggunaan
pointer sebagai moniker. Istilah moniker di sini berarti sesuatu yang menunjuk atau mengacu kepada
entitas lain. Istilah moniker ini bukanlah istilah standard dan lazim , tetapi sesuatu yang saya pilih
impromptu untuk membedakan dengan pointer atau reference yang sudah memiliki arti tersendiri.
Penggunaan lain pointer sebagai moniker adalah untuk mengatasi kelemahan bahasa C awal : Dahulu
fungsi – fungsi di C hanya mengerti pass by value. Pointer digunakan untuk mengemulasi pass by
reference karena pointer berisi alamat ke objek lain, sehingga fungsi tersebut dapat mengubah objek
tersebut dengan memanipulasi pointer. Pertanyaanya : siapa yang bertugas menentukan alamat objek
yang di tunjuk oleh pointer dalam kasus ini ? jelas bukan kompiler karena objek tersebut tidak
bernama. Apakah kita sebagai programmer menentukannya sendiri ? ternyata tidak. Hal tersebut
ditentukan oleh fungsi malloc dan sejenisnya (dan juga new di C++), atau untuk kasus passing pointer
ke dalam fungsi, operator &. Jadi dalam hal ini kita tidak juga menentukan alamat sebuah objek. —
Builtin Array di C dan C++ Sebelum membahas array di C dan di C++, ada baiknya kita membahas
tentang array. Array adalah asosiasi antara sebuah index dengan nilai. Jika diketahui sebuah index,
kita akan mengetahui nilainya. Dari definisi ini :
1. Tidak disebutkan bahwa index harus integer, atau tipe tertentu.
2. Tidak disebutkan range dari indexnya dimulai dari nilai tertentu, Bahkan tidak disebutkan
bahwa indeks nya memiliki batas bawah maupun batas atas.
3. Tidak disebutkan bahwa nilai harus disimpan secara contigous, bahkan tidak disebutkan
bahwa nilainya harus di simpan sama sekali. akan tetapi :
 Banyak bahasa pemrograman yang di desain tahun 60-an hingga tahun 70-an
menentukan bahwa index array adalah integer atau sesuatu yang bisa dikonversi
menjadi integer atau sesuatu yang memiliki nilai berurutan seperti integer.
 Beberapa bahasa menentukan bahwa array dimulai dengan nilai tertentu.
Contohnya di C, array dimulai dari 0 sementara di Pascal Array dimulai dari
1. Dalam Algo-68 programmer dapat menentukan sendiri batas- batas array. Akan tetapi dalam
semua bahasa pemrograman mengakses nilai dengan indeks yang di luar batas dianggap
sebagai programming error.
2. Semua bahasa pemrogramman yang saya tahu menyimpan elemen – elemen array di memory.
beberapa bahasa, misalnya C, menjamin bahwa elemen – elemen tersebut disimpan dalam
memory yang contigous.
Sekarang tipe yang lebih mendekati definisi awal array tersedia dengan nama associative array.
Tipe ini didukung oleh beberapa bahasa seperti PHP dan JavaScript, dan juga tersedia dalam beberapa
bahasa lain sebagai library ( seperti std::map di C++). Kembali ke C dan C++ array, kita dapat
tentukan beberapa property array : zero based, contigous dan convertible to pointer. Banyak alasan
dengan dipilihnya property seperti ini, tapi yang paling penting adalah efisiensi, yang akan kita
bicarakan sebentar lagi. setiap array dapat dikonversi menjadi pointer yang menunjuk ke elemen
pertama. Hal ini sangat konvenien mengingat dynamic array diciptakan dengan alokasi memori dari
free memory (dengan fungsi calloc, yang berarti contigous alloc. yang aneh adalah fungsi ini
berperilaku mirip dengan malloc kecuali dia menginisialisasi memori dengan nol. ). Kemudian kita
tahu bahwa elemen dalam array di simpan secara berurutan, dengan demikian alamat semua elemen
array adalah ptr + n * sizeof(elemen). Dengan mendefinisikan pointer arithmatic, didapat kesamaan
ar[idx] == *(ar + idx). hal ini menimbulkan sesuatu yang menarik , ar[idx] == *(ar + idx) == *(idx +
ar) == idx[ar] (yes, it is valid C !!). Operasi pointer arithmatic lain juga didefinisikan untuk pointer.
yang menarik adalah increment dan decrement. programmer dapat memeriksa semua elemen dalam
array dengan cara menginkremen pointer dari pointer penunjuk elemen pertama. Tentu saja hal yang
sama dapat dilakukan dengan indexing biasa, ar[idx], akan tetapi dengan operasi pointer bisa lebih
efisien. Alasannya terletak pada bagaimana cara komputer membaca data di ar[idx]. Untuk mesin
yang memiliki indexed addressing hal ini cukup sederhana dan efisien (ar jadi base, idx jadi index,
fetching cukup 1 instruksi mov). Tetapi untuk mesin yang tidak memiliki indexed addressing, akan
ada operasi ADD antara ar dan idx, lalu simpan hasilnya ke suatu tempat (register), lalu baru mov.
Kadang – kadang register tersebut digunakan untuk operasi ADD sehingga terdapat beberapa
mov untuk menyimpan state. Akan tetapi jika menggunakan pointer arithmatic, cukup meng-increase
nilai yang sudah ada di register, lalu mov. Tentu saja instruksi di dalam loop juga mempengaruhi
efisiensi ini, tetapi untuk mesin yang mendukung operasi increment langsung, iterasi lewat pointer
biasanya lebih efisien. Ini adalah penggunaan pointer sebagai iterator. Nama iterator diambil dari
STL, dan iterator di STL adalah abstraksi dari pointer. Yang menakjubkan adalah konsep iterator,
yang digeneralisasi dari pointer, adalah konsep yang cukup powerful untuk merepresentasikan semua
algoritma yang bekerja untuk linear container ( linear container adalah semua container yang memiliki
iterator yang menunjuk pada elemen pertama, memiliki iterator yang menunjuk pada elemen one-past-
end, dan semua elemen dapat dicapai dengan melakukan operasi incremen dari iterator penunjuk
elemen pertama sebanyak yang diperlukan. Contoh linear container adalah array, vector, linked – list,
dan deque. contoh yang bukan linear container adalah graph dan forest.). —Fixed memory Location
Dalam pemrograman, kita dihadapkan pada beberapa situasi seperti : – setelah startup, prosesor 80386
akan memulai eksekusi pada alamat ( … lupa). – Interrupt vector beberapa prosesor ditaruh pada
alamat yang ditentukan oleh pembuat prosesor tersebut. – Video Memory di DOS dimulai pada
alamat (… lupa). Situasi – situasi tersebut hanya mungkin terjadi jika kita memrogram “close to
metal” e.g membuat operating system, atau kita memrogram dalam OS yang super primitif seperti
DOS. Dalam kasus – kasus ini kita memerlukan pointer dengan alamat di set ke nilai tertentu. Ini
adalah penggunaan pointer sebagai abstraksi alamat di hardware. Penggunaan ini adalah penggunaan
pointer paling jarang. — So, What’s a big deal about it ? Ketiga fungsi pointer di atas memerlukan
operasi yang berbeda- beda. Contohnya jika pointer berfungsi sebagai moniker, operasi yang sangat
diperlukan adalah fungsi malloc, calloc, free, new, delete, operator ->, operator * dan operator &.
sebagai moniker pointer tidak memerlukan konvertability ke integer dan operasi pointer arihmatic
(walaupun ada trik mengakses field struct dari pointer dengan meng-cast pointer to struct menjadi
char*, tambahkan offsetnya, lalu baca dengan operator * dan di cast ke tipe field tersebut. trik ini
sangat berbahaya dan sebaiknya tidak dipakai ). Jika pointer berfungsi sebagai iterator, operasi pointer
arithmatic adalah esensial. Tetapi operasi new dan delete sama sekali tidak di perlukan (kecuali untuk
array of pointer). bottom line is: you do not do memory management via iterator. Sifat konvertibilitas
antara integer dan pointer hanya diperlukan jika pointer tersebut dipakai sebagai abstraksi fixed
address. Dua fungsi lain tidak memerlukan sifat ini. — Pointer in OOP C++ mendukung OOP, akan
tetapi pada saat yang sama juga kompatibel dengan C. Hal ini menimbulkan masalah. Akan tetapi
sebelum melihat apa masalahnya, ada baiknya kita bahas sedikit tentang Polymorphism.
Polymorphism adalah jawaban untuk pertanyaan: bagaimana cara menulis fungsi atau prosedur
yang tidak dibatasi oleh tipe. contohnya adalah fungsi average, fungsi ini menjumlahkan sejumlah
elemen dan membaginya dengan banyaknya elemen. hal ini benar untuk banyak tipe termasuk integer,
koordinat kartesian, bilangan kompleks, kuartenion, matrix ,dsb walau aturan penjumlahan tipe – tipe
tersebut berbeda. Untuk bahasa yang tidak mendukung polymorphism, anda harus menulis fungsi
seperti averageInt, averageMatrix, averageComplex, etc. Dari sifatnya, polymorphism terbagi dua: ad-
hoc polymorphism dimana polymorphism hanya bekerja pada tipe yang sudah ada. contoh mekanisme
ad-hoc polymorphism adalah function dan operator overloading. Sedangkan true polymorphism atau
parametric polymorphism dapat digunakan bahkan untuk tipe yang belum dispesifikasi. Perbedaan
lainnya adalah untuk ad-hoc polymorphism biasanya anda harus menulis fungsi untuk semua tipe
yang berpartisipasi dalam mekanisme polymorphism, sperti menulis average untuk integer, lalu untuk
quartenion, lalu satu lagi untuk complex, dll. Sedangkan untuk parametric polymorphism anda hanya
perlu menulis satu fungsi. Dari binding-time nya, polymorphism dapat dibagi 2: static dan dynamic
polymorphism. Static polymorphism menentukan fungsi mana yang akan di panggil (atau mungkin di
generate ) pada saat kompilasi. Sedangkan dynamic polymorphism menentukan fungsi yang di
panggil pada saat run-time. contoh static polymorphism adalah template, sedangkan contoh dynamic
polymorphism adalah virtual function. static polymorphism dapat dibagi menjadi predicative atau
impredicative, tetapi hal ini tidak ada hubungannya dengan diskusi kita. Untuk dynamic
polymorphism, dapat dibagi lagi berdasarkan berapa banyak parameter yang berpengaruh dari
penentuan fungsi. Jika hanya parameter pertama yang berpengaruh, hal ini disebut dengan single
dispatch. Jika lebih dari satu, hal ini disebut dengan multimethod. multimethod yang dipengaruhi oleh
dua parameter mempunyai nama khusus yaitu double dispatch. Harap perhatikan bahwa p-
>somefunc(a,b) itu secara prinsip sama dengan somefunc(p,a,b) dimana p adalah this parameter
(walaupun semua kompiler akan mereject kalau anda mengganti fungsi seperti itu). Dynamic
Polymorphism juga dapat dibagi berdasarkan constraint nya menjadi dua: Subtyping Polymorphism
dimana polymorphic type harus merupakan turunan dari satu base class yang merupakan sebuah
interface yang menentukan sifat mana yang polymorphic. Yang lainnya adalah DuckTyping yang
tidak memerlukan base class yang berfungsi sebagai interface. Dalam DuckTyping sebuah object
dapat menerima message apa saja, walau jika object tersebut tak dapat merespond message tersebut
objeck yang bersangkutan akan mengeluarkan error seperti DoesNotUnderstand message di
SmallTalk. Untuk subtype polymorphism, hal ini tidak mungkin karena sebuah object hanya akan
menghandle message yang didefinisikan di base class, dan kompiler akan mereject message lain.
Kembali ke bahasan kita, C++ mendukung Subtyping single dispatch dynamic Polymorphism. Jadi
untuk dynamic polymorphism, semua tipe yang ingin digunakan secara polymorphic harus diturunkan
dari satu base class. C++ juga mengharuskan semua fungsi yang bisa dipanggil secara polymorphic
harus dideklarasikan virtual. Dan pemilihan fungsi yang diperlukan hanya ditentukan oleh satu
parameter (this parameter) melalui mekanisme vtable. So, what’s the big deal ? Masalahnya adalah
untuk semua bahasa yang menggunakan subtype polymorphism, semua object harus bisa di akses
melalui base class nya. Jadi kode berikut harus valid: Parent p = create_child(); // asumsi nya create
child menghasilkan // object child; Hal ini menimbulkan pertanyaan : Bagaimana caranya membuat
kode di atas valid ? Dalam bahasa pemrograman tradisional, ketika anda mendeklarasikan sebuah
variabel, anda menciptakan instance dari sebuah tipe, kecuali jika dideklarasikan khusus. Di C
Sometype somevar; artinya anda menciptakan sebuah objek somevar bertipe Sometype. Sometype
somevar2 = somevar; artinya anda mengkopi nilai somevar ke somevar2 somevar2 == somevar; //
OK, ini tidak didefinisikan di C untuk User Defined Type, // but you got the idea artinya anda
membandingkan nilai somevar dengan nilai somevar2. Mari kita sebut ini value semantic, dimana
sebuah variabel mengandung isi instance dari tipe tertentu. Lalu perhatikan kode berikut : Child child;
Parent parent = child; See the problem ? Masalahnya adalah anda mencoba mengkopi nilai child ke
variabel parent, tapi apa artinya operasi kopi tersebut ? jika berarti mengopi nilai byte by byte,
implikasinya adalah ukuran parent dan child harus sama. Akan tetapi hal ini sulit atau tidak mungkin
dipenuhi. Bila parent adalah pure interface, parent hampir tidak memiliki data member, tapi child
akan memiliki data member untuk mendukung operasi – operasi method-nya. Bagaimana cara
mengatasinya ? salah satu cara yang populer adalah dengan tidak menggunakan value semantic. Di
bahasa seperti Java, setiap variable adalah reference ke sebuah instance. Artinya :
1. Ketika anda mendeklarasikan sebuah variabel, anda tidak menginstansiasi sebuah object.
object harus di instansiasi secara terpisah, biasanya lewat operator new.
2. Ketika anda mengkopi dua buah variabel, anda tidak mengkopi instance byte by byte, tapi
hanya membuat dua reference mengacu pada object yang sama. Jika ingin menghasilkan
kopi dari instance, biasanya anda menggunakan method seperti clone.
3. Ketika anda membandingkan dua buah variabel, anda hanya mengetahui apakah dua
variabel tersebut merujuk pada objek yang sama atau tidak. jika anda ingin
membandingkan nilainya, anda harus menggunakan method seperti equal. let’s call this
reference semantic. Masalahnya C++ karena berbagai alasan (salah satunya
kompatibilitas dengan C) tidak mungkin mengadopsi reference semantic dan harus tetap
menggunakan value semantic. Akan tetapi reference semantic sepertinya diperlukan
untuk subtype polymorphism. so, what to do ? Ternyata Pointer adalah object yang dapat
dipakai untuk mengemulasi reference semantic tanpa harus mengubah bahasa
menggunakan reference semantic. Dengan demikian dynamic polymorphism di C++
harus menggunakan pointer (atau reference, yang sebenarnya adalah pointer dengan
sedikit perubahan sifat).
Bahaya Pointer :
1. Bahaya yang mungkin ada dengan pointer sebagai moniker: memory leak, double delete,
invalid memory access. Semuanya dapat dihindari dengan ownership analysis yang bagus
(pada setiap saat, harus diketahui pihak mana yang bertanggung jawab mendelete sebuah
object). Jika hal ini sulit dilakukan, misalnya karena shared ownership, anda dapat
menggunakan smart pointer atau garbage collector.
2. Bahaya yang mungkin ada dengan pointer sebagai iterator: array out of bound. Salah satu cara
yang efektif menghindari hal ini adalah dengan menggunakan standard algorithm.
3. Bahaya yang mungkin ada dengan pointer sebagai abstraksi fixed memory : Tidak tahu, tetapi
ini bukan mainan sembarang programmer.

Bahasa Pemrograman tanpa pointer ?


1. Semua Bahasa pemrograman Fungsional, terutama yang murni , tidak mengenal pointer atau
memerlukan pointer. Akan tetapi bahasa ini menggunakan model komputasi yang jauh
berbeda, bukan abstract C machine.
2. Beberapa bahasa pemrograman dengan reference semantik dapat mengklaim mereka tidak
memiliki pointer, akan tetapi setiap variabel sebenarnya adalah pointer. Secara fisik mungkin
reference tidak memiliki struktur seperti pointer (biasanya merupakan data struktur yang lebih
kompleks sehingga lebih friendly terhadap garbage collector) tapi reference tersebut memiliki
fungsi yang mirip dengan pointer di C atau C++. Ada yang bilang bahwa reference dalam
bahasa – bahasa ini menyebabkan optimasi lebih mudah karena tidak menyebabkan aliasing,
tetapi optimasi tersebut juga mungkin dilakukan di C dan C++ ( dengan restrict pointer,
sayangnya belum merupakan bagian dari standard C++).
Daftar Pustaka
http://adamrocknroll.blogspot.com/2009/03/definisi-array.html
http://ty000.wordpress.com/2010/03/10/penjelasan-mengenai-pointer/
http://www.kaskus.us/showthread.php?t=4044482

Anda mungkin juga menyukai