• Tidak ada hasil yang ditemukan

BAB 6 POINTER DAN REFERENCE

N/A
N/A
Protected

Academic year: 2021

Membagikan "BAB 6 POINTER DAN REFERENCE"

Copied!
26
0
0

Teks penuh

(1)

BAB 6

POINTER DAN REFERENCE

.

6.1 Pendahuluan

Salah satu kelebihan dari bahasa C/C++ adalah karena bahasa ini mendukung sepenuhnya untuk pemanipulasian memori dengan menggunakan pointer. Namun di balik itu, pointer juga merupakan salah satu fitur C + + yang berbahaya karena dapat mengakibatkan sistem operasi pada komputer kita menjadi crash (rusak). Penggunaan pointer dengan cara yang salah juga dapat menyebabkan bug yang sangat sulit untuk ditemukan pada program kita.

Bagian ini akan menjelaskan bagaimana pointer bekerja dan mengapa penggunaan pointer tersebut sangat dibutuhkan dalam program. Melalui bab ini diharapkan Anda dapat mengenal pointer secara lebih dalam dan mampu mengimplementasikannya pada kasus-kasus program yang Anda hadapi.

6.2 Variabel Pointer

Sebelum melangkah lebih jauh, mungkin Anda bingung apa sebenarnya pointer? Secara definisi, pointer dapat dikatakan sebagai suatu variabel yang menyimpan alamat memori. Pada bab-bab sebelumnya kita sudah terbiasa dengan penggunaan variabel, tapi variabel-variabel tersebut hanya berisi nilai, bukan alamat.

(2)

Jika kita mempunyai sebuah variabel dengan tipe data tertentu, maka untuk mendapatkan alamat dari variabel tersebut adalah dengan menggunakan operator &. Alamat inilah yang kemudian akan disimpan ke dalam variabel yang bertipe pointer. Sedangkan untuk mendeklarasikan variabel sebagai pointer, kita hanya menambahkan tanda asterisk (*) di depan nama variabel.Berikut ini bentuk umum dari pendeklarasian variabel yang bertipe pointer.

tipe_data *nama_pointer;

Sebagai catatan bahwa penulisan di atas dapat diganti dengan tipe_data* nama_pointer atau tipe_data * nama_pointer. Tipe data di atas berguna untuk menyatakan bahwa pointer yang kita deklarasikan tersebut akan ditempati oleh data dengan tipe tertentu. Sebagai contoh, kita akan mendeklarasikan pointer P yang akan ditempati oleh tipe data long, maka bentuk pendeklara-siannya adalah sebagai berikut :

long *P; / / Mendeklarasikan pointer P

1 // yang akan menunjuk ke tipe long

Jika kita mempunyai sebuah variabel yang bertipe long (misalnya X), maka kita dapat memerintahkan pointer P di atas untuk menunjuk ke alamat yang ditempati oleh variabel X. Adapun sintaks untuk melakukan hal tersebut adalah seperti yang terlihat di bawah ini.

long X; // Mendeklarasikan variabel X dengan tipe long

P =: &X; // Memerintahkan P untuk menunjuk alamat dari variabel

x

:

"••• HHHHHHHHP "BHHBBBBHHHHHB

Apabila kita analisis potongan sintaks di atas, sebenarnya konsepnya sangat sederhana. Kita tahu bahwa P adalah pointer (berisi alamat) dan &X juga berisi alamat, maka kita dapat menyimpan alamat dari variabel X tersebut ke dalam pointer P. Kita tidak diizinkan untuk memasukkan sebuah nilai (bukan alamat) ke dalam pointer P. Misalnya dengan menuliskan sintaks seperti

berikut :

P « X; // SAIAH, karena X berupa nilai (bukan berupa alamat)

Jika kita memang ingin mengisikan nilai ke dalam alamat yang disimpan oleh pointer P, maka seharusnya kita menggunakan tanda asterisk (*) di depan nama pointer tersebut, yaitu dengan mengubah sintaks di atas menjadi seperti di bawah ini.

*P .= X; // BENAR, karena *P adalah?;nilai

/ / yang berada pada pointer P

Pemrograman C++

Sebagai catatan bahwa * P ini disebut dengan dereference pointer. Untuk dapat lebih memahami konsep pointer. Berikut ini gambar yang mengilustrasikan kasus di atas.

Pointer P Alamat X (&% Alamat 2 Alamat 3 Alamat 4 10 20 30 40 Memori Niia

Pada gambar di atas alamat 1 dari memori ditempati oleh variabel X yang bertipe long. Adapun nilai dari variabel X tersebut adalah 10. Di atas kita mempunayai pointer P yang menunjuk ke alamat X, maka untuk mendapatkan nilai X kita dapat menggunakan dereference pointer, yaitu dengan *P. Dengan demikian dapat disimpulkan bahwa jika :

P ' » &X; // Keduanya menyimpan alamat Maka :

*P «::..X // Keduanya menyimpan nilai

Untuk membuktikan hal di ' atas, di sini kita akan mengimplementasikannya ke dalam sebuah program sederhana. Adapun sintaks program tersebut adalah sebagai berikut :

Kode Program 6-1 #include <iostream> using namespace std; int main() { long *P; long X; P = &X;

X = 10; // Mengisikan nilai 10 ke dalam variabe cout«"Nilai X

cout«"Nilai *P

x«X«endl; v«*P«endl;

(3)

cout« "Nilai P cout«"Nilai &X

*«P«endl; "«&X«endl ;

fP = 200; // Mengisikan nilai 200 ke dalam *P cout« "Nilai X cout«"Nilai *P ,cout« "Nilai P cout«"Nilai &X return 0; («X«endl; x<*P«endl; 1«P«endl; '«&X«endl,

Contoh hasil yang akan diberikan dari program di atas adalah sebagai berikut: Nilai X Nilai *P Nilai P Nilai &X Nilai X Nilai *P Nilai P Nilai &X : 10 : 10 : 0065FDFC : 0065FDFC : 200 :200 : 0065FDFC : 0065FDFC

Jika kita amati hasil program di atas, pada saat kita mengisikan variabel X dengan nilai 10, *P juga akan bernilai 10. Sedangkan pada saat kita memasukkan nilai ke dalam *P dengan nilai 200, variabel X juga akan berubah nilainya menjadi 200. Hal ini menunjukkan bahwa *P akan selalu sama dengan X, dan ini semua disebabkan karena *P dan variabel X tersebut menempati alamat yang sama.

6.3 Memasukkan Nilai pada Pointer

Pada sub bab ini kita akan membahas bagaimana cara memasukkan nilai pada pointer. Nilai yang dimaksud di sini tentu berupa alamat, bukan berupa nilai data. Walaupun tampak mudah tapi kita juga harus berhati-hati dalam melakukan hal ini. Perlu diperhatikan bahwa tipe data dari pointer harus sama dengan tipe

data dari variabel yang akan menempatinya. Hal ini merupakan hal yang biasa terabaikan oleh para programmer pemula. Misalnya kita mendeklarasikan pointer P ke tipe double dan kita juga memiliki variabel X yang bertipe int. Pada kasus ini kita tidak diizinkan untuk menyimpan alamat dari variabel X ke pointer P karena tipenya berbeda. Berikut ini sintaks programnya.

double *P; MMHHK*' _________ int X; // Mendeklarasikan variabel yang bertipe int

P = &X; /* SALAH, karena P hanya dapat menyimpan alamat

dari variabel-variabel yang bertipe double saja

6.4 Pointer Tanpa Tipe

Pada sub bab sebelumnya kita telah mengetahui bahwa pointer harus diisikan dengan alamat dari variabel yang bertipe sama dengan tipe pointer tersebut. Sebenarnya ada cara khusus yang untuk membuat pointer yang kita deklarasikan tersebut dapat menunjuk ke semua tipe data, yaitu dengan mendeklarasikan pointer tersebut sebagai pointer tanpa tipe. Pointer semacam ini sering dinamakan dengan void pointer. Adapun bentuk umum untuk mendeklarasikan pointer tanpa tipe ini adalah sebagai berikut :

void *nama_pointer;

Berikut ini contoh program yang dapat membuktikan bahwa pointer tanpa tipe (void pointer) dapat menyimpan alamat dari variabel-variabel yang bertipe apapun.

Kode Program 6-2 #include <iostream>

using namespace std; int main() {

void *P; // Mendeklarasikan pointer P

// sebagai pointer tanpa tipe

// Mendeklarasikan variabel X, Y dan Z dengan tipe berb

int X; long Y; double Z;

// Memerintahkan P untuk menunjuk ke alamat dari variabel X Bab 6: Pointer dan Reference

(4)

P = &X;

X = 10; // Mengisikan variabel X dengan nilai 10

// Menampilkan has 11

cout« "Nilai X : "«X«endl; cout«"Nilai P : "«P«endl; cout«"Nilai &X : "«&x«endl; cout«endl ;

// Memerintahkan P untuk menunjuk ke alamat dari variabel Y P = &Y;

Y = 2000; // Mengisikan variabel Y dengan nilai 2000

// Menampilkan has il

cout« "Nilai Y : "«Y«endl; cout«"Nilai P : "«P«endl; cout«"Nilai &Y : "«&Y«endl; cout«endl;

// Memerintahkan P untuk menunjuk ke alamat dari variabel Z P o &Z;

Z = 21.0378; // Mengisikan variabel Z dengan nilai 21.0378

// Menampilkan hasil

cout«"Nilai Z : "«Z«endl; cout« "Nilai P : "«P«endl; cout« "Nilai &Z : "«&Z«endl; return 0 ;

Hasil yang akan diberikan dari program di atas adalah sebagai berikut : Nilai X Nilai P Nilai &X Nilai Y Nilai P Nilai &Y Nilai Z Nilai P Nilai &Z 10 0065FDFC 0065FDFC 2000 0065FDF8 0065FDF8 21.0378 0065FDFO 0065FDFO

Seperti yang kita lihat di atas bahwa P dapat menunjuk ke tipe data yang berbeda-beda. Sebagai bukti dari hal ini adalah nilai P yang berbeda, yaitu sesiiai dengan alamat dari variabel yang ditunjuk.

Pemrograman C++

6.5 Melakukan Inisialisasi pada Pointer

Setiap kita mendeklarasikan sebuah pointer, maka pointer tersebut akan menunjuk lokasi acak di memori. Oleh karena itu kita harus mengeset pointer yang kita deklarasikan tersebut dalam keadaan NULL, atau tidak menunjuk lokasi manapun. Untuk membuktikan hal ini, jalankan program di bawah ini.

Kode Program 6-3 #include <iostream>

using namespace std; int main() {

int *P; // Mendeklarasikan pointer P

// yang akan menunjuk tipe data int

cout« "Alamat yang ditunjuk oleh pointer P : "«p;

-return 0;

Contoh hasil dari program di atas adalah sebagai berikut

Alamat yang ditunjuk oleh pointer P : 006821A4

Sekarang jika kita melakukan pengesetan (inisialisasi) terhadap pointer tersebut dengan nilai NULL, seperti pada program di bawah ini.

ttinclude <iostream> using namespace std; int main{) {

int *P; // Mendeklarasikan pointer P

// yang akan menunjuk tipe data int

P = NULL; // Mengeset pointer P dengan nilai NULL

cout«"Alamat yang ditunjuk oleh pointer P : "«P; return 0;

)

(5)

Maka hasil yang akan diperoleh adalah sebagai berikut

Alamat yang ditunjuk oleh pointer P : 00000000

Nilai 0 0 0 0 0 0 0 0 di atas menunjukkan bahwa pointer tersebut tidak menunjuk ke lokasi acak di memori.

6.6 Konstanta pada Pointer

Sama halnya seperti variabel biasa, pointer juga dapat bernilai konstan. Adapun caranya juga sama yaitu dengan menggunakan kata kunci const. Namun perlu untuk diperhatikan bahwa penempatan kata kunci const yang salah akan menyebabkan perbedaan arti. Kata kunci const dapat ditempatkan sebelum tipe data, sesudah tipe data ataupun pada keduanya (sebelum dan sesudah). Berikut ini adalah penggunaan kata kunci const pada pointer beserta arti yang dikandungnya.

6.6.1 Sebelum Tipe Data

Bentuk umumnya adalah sebagai berikut : const tipe__data * nama_pointer;

Bentuk di atas berarti bahwa pointer akan menunjuk ke nilai dengan tipe data tertentu, dimana nilai tersebut bersifat tetap. Berikut ini contoh implementasi dari konsep di atas.

Kode Program 6-5 f include <iostream> using namespace std; int main() { const int *P1; "int X, Y;

// PI akan menunjuk ke tipe data int

// yang bersifat tetap

PI = &X;

/ *P1 = 2;

PI = &Y; return 0;

// SALAH, karena nilai yang ditxmjuk oleh PI // (nilai *Pl) bersifat tetap

// BENAR, karena pointer PI tidak bersifat tetaj

Pada program di atas kita melihat bahwa mula-mula Pi menunjuk alamat dari variabel X. Pendeklarasian const int *P1 menyatakan bahwa pointer PI menunjuk ke nilai yang tetap, bukan alamat yang tetap sehingga kita masih diizinkan untuk mengubah pointer PI supaya menunjuk ke alamat yang baru, yaitu alamat dari variabel Y.

6.6.2 Sesudah Tipe Data

Bentuk umumnya adalah sebagai berikut: tipe_data * const nama_pointer;

Berbeda dengan sebelumnya, di sini pointer bersifat tetap sehingga alamatnya tidak dapat diubah. Namun nilai dari variabel yang ditunjuk dapat diubah. Berikut ini contoh program yang mengimplementasikannya. Kode Program 6-6 ttinclude <iostream> using namespace std; int main(} { int X=5, Y=10;

int * const P2 = &X;// P2 akan menunjuk ke alamat yang teta // yaitu alamat X

*P2 = 2; // BENAR, karena nilai *P2 dapat diubah

II P2 = &Y; // SALAH, karena pointer P2 tidak bersifat tetap return 0;

(6)

Apabila kita amati program di atas, mula-mula X bernilai 5. Kemudian alamat X ditunjuk oleh pointer P2. Oleh karena pointer P2 merupakan pointer konstan (tetap) maka pernyataan P2 = &Y tidaklah diizinkan oleh kompiler. Namun kita masih diperbolehkan untuk mengubah nilai yang terdapat di dalam alamat tersebut.

6.6.3 Sebelum dan Sesudah Tipe Data

Bentuk umumnya adalah sebagai berikut:

const tipe^data * const nama_pointer;

Bentuk yang ketiga ini merupakan bentuk gabungan dari bentuk yang pertama dan kedua. Artinya di sini kita mendeklarasikan pointer konstan yang menunjuk ke suatu nilai yang konstan pula. Dengan kata lain pointer ini menunjuk alamat yang tetap dimana alamat tersebut juga berisi nilai yang tetap. Berikut ini contoh penggunaannya dalam program.

Kode Program 6-7 finclude <iostream>

using namespace std;

t

const int * const P3 = &X; /* P2 akan menunjuk ke alamat

yang tetap,

yaitu alamat X dan nilai yang ditunjuk juga tetap */ II *P3 = 2 ; // SALAH, karena nilai *P2 tidak dapat diubah II P3 = &Y; // SALAH, karena pointer P2 tidak bersifat tetap

return 0;

HHHH

Mula-mula nilai X = 5, sedangkan alamat dari X ditunjuk oleh pointer P3. Oleh karena P3 adalah pointer yang bersifat tetap dan juga menunjuk ke nilai yang tetap, maka statemen *P = 2 dan P3

= &Y di atas tidaklah diizinkan oleh kompiler.

Pemrograman C++

6.7 Pointer ke Pointer (Multiple Indirection)

Dalam C/C+ + , kita dapat mempunyai pointer yang menunjuk ke pointer lain yang telah menunjuk ke alarnat tertentu. Situasi ini sering disebut dengan multiple indirection atau pointer ke pointer. Pointer ke pointer ini memang sering membingungkan, apalagi untuk seorang programmer pemula.

Sebenarnya konsepnya sederhana, kita tahu bahwa pointer normalnya berisi alamat dari sebuah objek (variabel) yang menyimpan nilai berupa data. Sekarang kita mempunyai pointer lagi yang akan menunjuk ke pointer tadi. Sebagai gambaran, perhatikan gambar ilustrasi di bawah ini.

Alamat Nilai

Alamat Alamat Nilai

Untuk mendeklarasikan sebuah pointer yang akan menunjuk ke pointer lain adalah dengan menggunakan tanda asterisk sebanyak dua kali (**). Sebagai contoh, jika kita mendeklarasikan pointer seperti pada potongan sintaks di bawah ini.

int **P;

Maka P bukan pointer yang menunjuk ke tipe data int, melainkan pointer yang menunjuk pointer ke tipe data int. Untuk dapat lebih memahaminya, perhatikan program di bawah ini.

Kode Program 6-8 #include <iostream> using namespace std; int main() { int X = 25, int *P1; int **P2; // Mendeklarasikan variabel X

// dengan nilai default 25 // Mendeklarasikan pointer PI // yang akan menunjuk ke tipe data int // Mendeklarasikan pointer P2

(7)

// yang akan menunjuk ke pointer Pi PI = &X; P2 = &P1; // Menampi1kan nilai cout« "Nilai X : cout«"Nilai *P1 : cout«"Nilai *P2 : cout«"Nilai **P2 : cout«endl ; x«X«endl; 1«*Pl«endl; v«*P2«endl; '«**P2«endl; // Menampilkan alamat

cout«"Nilai &X : w«&x«endl; cout«"Nilai PI : "«Pl«endl; cout«"Nilai P2 : "«P2«endl; return 0;

Hasil yang akan diperoleh dari program di atas adalah sebagai berikut: Nilai X Nilai *P1 Nilai *P2 Nilai **P2 Nilai &X Nilai PI Nilai P2 25 25 0065FEOO 25 0065FEOO 0065FEOO 0065FDFC

Apa yang dapat Anda simpulkan? Seperti yang kita lihat bahwa nilai X dapat diakses dengan menggunakan *P1 atau **P2, sedangkan alamat dari variabel X dapat diakses dengan menggunakan &X, P ataupun *P2 (catatan : *P2 merupakan nilai yang menempati alamat yang ditunjuk oleh pointer P2). Hal ini membuktikan bahwa pointer P2 tidak menunjuk ke tipe data int, melainkan menunjuk ke pointer Pi. Dan yang terakhir, P2 sendiri menyimpan alamat dari pointer PI. Untuk contoh di atas, P2 menyimpan alamat 0065 FDFC.

Sebagai catatan bagi Anda yang pernah mempelajari struktur data lanjut seperti linked list yang menggunakan pointer, Anda jangan berasumsi bahwa hal ini sama dengan pointer ke pointer. Linked Pemrograman C++

list dan pointer ke pointer masing-masing merupakan dua hal yang berbeda, sehingga keduanya memiliki konsep yang berbeda pula.

6.8 Pointer Aritmetika

Sama seperti pada variabel biasa, pointer juga dapat berperan sebagai operand untuk operasi aritmetika. Situasi seperti ini lebih dikenal dengan sebutan pointer aritmetika. Namun untuk membahas pointer aritmetika ini kita perlu menyinggung sedikit tentang array dengan menggunakannya sebagai contoh. Pembahasan mengenai array sendiri akan dijelaskan secara detil pada bab selanjutnya (jbaJb 7. Array) dalam buku ini.

Jika kita mempunyai variabel A yang bertipe array yang berisi 5 elemen dari tipe int, maka untuk mengakses elemen-elemen array tersebut kita dapat juga menggunakan pointer (misalnya P), yaitu dengan melakukan operasi aritmetika ke dalamnya. Berikut ini gambar yang mengilustrasikan kasus tersebut.

Arm -ft-LuJ A r i i A[1J A TOT A|^J AR1 Apj A M I Ar*J inn onn ZUU ^nn jUU 4nn ^nn Prtintpr P P i 1 T 1 P i 0 T £ P + ? "P -1- A

Sebagai contoh untuk mengimplementasikan konsep pointer aritmetika, perhatikan program di bawah ini.

Kode Program 6-9 tinclude <iostream>

using namespace std; int main() {

// Mendeklarasikan array dari tipe int sebanyak 5 elemen int A[5] = { 100, 200, 300, 400, 500 };

// Mendeklarasikan pointer P yang menunjuk ke tipe data i.nt int *P;

(8)

~

// Memerintahkan pointer P

// untuk menunjuk elemen array pertama (elemen ke-0) P = &A [ 0 ] ;

// Menampilkan nilai yang alamatnya ditunjuk oleh pointer P cout«"Nilai *P : M«*P«endl;

// Melakukan operasi aritmetika (penjumlahan)

// terhadap pointer P

P = P+2;

// Menampilkan kembali nilai yang alamatnya ditunjuk

// oleh pointer P

cout« "Nilai *P : "«*p«endl;

// Melakukan operasi aritmetika (pengurangan)

// terhadap pointer P

P = P-l;

// Menampilkan kembali nilai yang alamatnya ditunjuk

// oleh pointer P

cout« "Nilai *P : "«*P«endl;

// Melakukan operasi aritmetika (perkalian) terhadap pointer

// P

// P = P*4; // SALAH, hal ini tidak diizinkan oleh kompiler

// Melakukan operasi aritmetika (pembagian) terhadap pointer // P

// P = P / 2f // SALAH, hal ini tidak diizinkan oleh // kompiler

return 0;

Hasil yang akan diperoleh dari program di atas adalah sebagai berikut :

Nilai *P : 100 Nilai *P : 300 Nilai *P : 200

Apabila kita analisis hasil dari program di atas, mula-mula pointer P menunjuk alamat dari A [ 0 ] sehingga nilai yang ditampilkan adalah 100. Kemudian kita melakukan penjumlahan pada pointer sebesar dua dengan statemen P = P + 2, hal ini akan menyebabkan pointer akan menunjuk ke alamat dari A [ 3 ] sehingga nilai yang ditampilkan adalah 300. Terakhir, kita melakukan pengurangan Pemrograman C++

terhadap pointer P sebesar 1 dengan statemen P = P 1;. Ingat, saat ini pointer P menunjuk ke alamat dari A [ 3 ] sehingga jika dilakukan pengurangan sebesar satu maka pointer tersebut akan menunjuk ke alamat dari A [ 2 ] sehingga nilai yang ditampilkan pun adalah 200. Sebagai catatan, operasi aritmetika yang dapat dilakukan terhadap pointer hanya operasi penjumlahan dan pengurangan saja, selain itu tidak diizinkan oleh kompiler.

6.9 Menggunakan Kata Kunci new

Dalam bahasa C+ + , jika kita ingin mengalokasikan memori pada ruang yang masih kosong maka kita dapat menggunakan kata kunci new. Kata kunci ini akan diikuti oleh tipe data yang akan dialokasikan sehingga kompiler akan mengetahui seberapa besar ruang memori yang dibutuhkan untuk proses pengalokasian tersebut. Misalnya jika kita mengalokasikan tipe data long, maka ruang yang dibutuhkan adalah 4 byte sedangkan jika tipe data unsigned short hanya membutuhkan 2 byte. Begitu juga untuk mengalokasikan tipe data lainnya, ruang yang dibutuhkan tentu akan berbeda pula. Pada saat kita mengalokasikan memori, alamat memori yang dialokasikan tersebut tentu akan kita simpan ke pointer, sehingga sebelumnya kita harus mendeklarasikan pointer terlebih dahulu. Bentuk umum dari penggunaan kata kunci new adalah sebagai berikut:

nama_pointer = new tipe_data;

Namun jika kita ingin mengalokasikan n buah ruang memori, maka

kita menggunakan bentuk umum di bawah ini. nama_pointer = new tipe_data [n];

Misalnya kita akan mengalokasikan 10 buah ruang memori dengan menggunakan tipe long (berukuran 4 byte), maka memori yang dibutuhkan adalah 10 x 4, yaitu 40 byte. Berikut ini contoh penggunaannya dalam program.

#include <iostream> #define MAX 5

using namespace std; int main(} {

(9)

float *P1; int *P2;

return 0;

Pi = new float; // Mengalokasikan satu ruang memori

// dan disimpan ke pointer PI

*P1 = 3 . 1 4 ; // Mengisikan nilai ke dalam ruang

// yang telah dialokasikan // Menampilkan nilai dan alamat yang disimpan // dalam pointer PI

cout« "Nilai *P1 : "«*Pl«endl; cout« "Nilai Pi : "«Pl«endl; cout« ' \n' ;

// Mengalokasikan 5 buah ruang memori dan disimpan

// ke pointer P2

P2 = new int [MAX] ;

// Mengisikan nilai ke dalam ruang-ruang memori

// yang telah dialokasikan

for (int C=0; C<5; C++) { *P2 = (C+l) * 10;

P2 += 1;

// Mengembalikan pointer P2 agar menunjuk ke alamat

// dari elemen ke-0

P2 -= 5;

// Menampilkan nilai dan alamat yang disimpan

// dalam pointer P2

for (int c=0; c<5; C++) { cout« "Nilai *P2 ke-"«c«" cout«"Nilai P2 ke-"«c«" P2 •+= 1;

Contoh hasil yang diberikan dari program di atas adalah sebagai berikut: Nilai *P1 Nilai PI :3.14 : 00682EB8 Nilai *P2 ke-0 : 10 Nilai P2 ke-0 : 00683344 Nilai *P2 ke-1 : 20 Nilai P2ke-l Nilai *P2 ke-2 Nilai P2ke-2 Nilai *P2 ke-3 Nilai P2ke-3 Nilai *P2 ke-4 Nilai P2ke-4 : 00683348 :30 : 0068334C * :40 : 006833SO :50 : 00683354 >..' i. ,' "i r* \ » * ^/ > ^-r V '/<:• ' -f -T mmmu \><-t^/ sEf^^~^^S!^fKi *i j"^' O fF/^&Tto^\9l ** v*. F * JSS\ H^^^I o r"i ; 'f fg i^^'^M ]| r"

lU^^r. ^o?

^ ^ \ O x '~~- — ^ ^ i w > ~ ^i'"1

'•/'OS^>^ "*J

Apabila kita amati alamat dari setiap elemen yang terdapat pada pointer P2 (00683344, 00683348, . . . ) , di situ selalu mendapat penam-bahan nilai 4. Hal ini disebabkan karena ukuran dari tipe data int adalah 4 byte. Selain menggunakan kata kunci new, C + + juga mendukung fungsi malloc ( ) yang sebenarnya adalah milik dari bahasa C. Fungsi ini juga berguna untuk mengalokasikan memori. Untuk menggunakan fungsi ini kita harus mendefinisikan file header stdlib.h atau untuk kompiler C + + standar kita dapat menggunakan <cstdlib>. Berikut ini contoh penggunaannya dalam program. Kode Program 6-11 #include <iostream> tinclude <cstdlib> using namespace std; int main() { int *P;

// Mengalokasikan 10 ruang di memori untuk tipe data i P = (int *) malloc(10*sizeof(int));

// Mengisikan dan sekaligus menampilkan nilai yang disimpai for (int C=0; C<10; C++) {

*P = (C+l) * 10; cout«*P«endl ;

P += 1; // P menunjuk ke alamat berikutnya return 0;

Hasil yang akan diperoleh dari program di atas adalah sebagai berikut:

(10)

10 20 30 40 50 60 70 80 90 100

6.10 Menggunakan Kata Kunci delete

Setelah memori yang kita alokasikan untuk keperluan tertentu sudah tidak digunakan lagi, maka sebaiknya jika mendealokasikan kembali memori tersebut. Hal ini baik untuk menghindari terjadinya pemborosan memori. Untuk melakukan ini, C + + menyediakan kata kunci delete. Bentuk umum dari penggunaan kata kunci delete adalah sebagai berikut :

delete nama_pointer;

Jika kita ingin mendealokasikan n buah ruang memori, maka kita

menggunakan bentuk umum di bawah ini. delete [n] nama_pointer;

// atau cukup ditulis delete [] nama_pointer;

Berikut ini adalah contoh program yang menggunakan kata kunci delete di dalamnya.

ttinclude <iostream> using namespace std; int main() {

int *P; // Mendeklarasikan pointer P yang menunjuk // ke tipe data int

// Melakukan alokasi memori P = new int;

Pemrograman O

:// Menggunakan memori yang telah dialokasikan *P = 100;

cout«"Nilai *.P •'«*P«en.dl; // Melakukan deal okasi memori delete P;

return 0;

Hasil yang

berikut: akan diperoleh dari program di atas adalah sebagai

Nilai *P : 100

C + + juga mendukung fungsi dalam bahasa C yang berguna untuk mendealokasikan memori, yaitu fungsi free ( ) . Fungsi ini merupakan fungsi kebalikan dari fungsi m a l l o c ( ) . Berikut ini contoh program yang menggunakan fungsi f ree ( ) .

Kode Program 6*13 #include <iostream> ttinclude <cstdlib> using namespace std; int main (} { int *P;

// Mengalokasikan memori sebesar 4 byte untuk tipe int P = {int-*) malloc(sizeof(int));

// Menggunakan ruang memori yang telah dialokasikan = 100;

cout«"Nilai *P : "«*P; // Mendealokasikan memori free(P);

return 0;

Hasil yang akan diperoleh dari program di atas adalah sebagai berikut :

Nilai *P : 100

(11)

6.11 Memory Leak

Dalam pemanipulasian memori dengan menggunakan pointer, kita harus dapat mencegah terjadinya memory leak (=kebocoran memori). Secara definisi memory leak dapat diartikan sebagai suatu kejadian dimana terdapat memori yang terbuang sia-sia. Artinya memori tersebut masih berisi nilai, tetapi nilai ataupun alamatnya sudah tidak dapat diakses maupun didealokasikan lagi. Hal ini tentunya akan menyebabkan pemborosan memori. Untuk memahami konsepnya, perhatikan potongan sintaks program berikut.

int *P;

// Mengalokasikan ruang memori dan menyimpanny, // ke dalam pointer P

P = new int;

// Mengisikan nilai ke dalam alamat tersebut *P = 10;

// Memerintahkan P untuk menunjuk ruang memori yang baru P = new int; : ;

// Mengisikan nilai ke dalam alamat yang baru *P = 25;

Mula-mula pointer P menunjuk ke alamat yang dialokasikan pertama kali dan mengisikan nilai ke dalam alamat tersebut dengan 10. Untuk memudahkan pembahasan pada kasus ini alamat tersebut kita namakan alamat ke-1. Selanjutnya, tanpa mendealokasikan alamat ke-1 terlebih dahulu, program di atas memerintahkan pointer P untuk menunjuk ke alamat lain yang baru dialokasikan, yang kita sebut dengan alamat ke-2. Hal ini tentu akan menyebabkan alamat ke-1 (serta nilai yang terdapat di dalamnya) tidak dapat diakses maupun didealokasikan lagi. Kejadian semacam inilah yang dinamakan dengan memory leak. Untuk mencegah kejadian ini, sebelum memerintahkan P untuk menunjuk ke alamat ke-2 seharusnya kita mendealokasikan alamat ke-1 terlebih dahulu, sehingga memori tidak akan terbuang percuma. Oleh karena itu program di atas seharusnya dituliskan seperti berikut.

// Mengalokasikan ruang memori dan menyimpannya // ke dalam pointer P

P = new int;

// Mengisikan nilai ke dalam alamat tersebut

10;

//Mendealokasikan terlebih dahulu alamat // yang ditunjuk.oleh pointer P

delete P;

// Memerintahkan P untuk menunjuk ruang memori yang baru P = new int;

// Mengisikan nilai ke dalam alamat yang baru

* P . = 25;

6.12 Reference

Reference digunakan untuk membuat alias atau nama lain (julukan) dari sebuah variabel. Sebagai contoh jika terdapat seseorang yang bernama Bjarne Stroustrup, maka kita dapat membuat alias atau julukan dari nama tersebut, misalnya dengan alias BS. Oleh karena Bjarne Stroustrup dan BS sebenarnya adalah satu orang, maka apa yang dilakukan terhadap Bjarne Stroustrup, berarti itu juga terjadi pada BS.

Setelah mendapat gambaran tersebut, sekarang kita kembali ke pokok permasalahan kita tentang reference. Untuk membuat reference adalah dengan menggunakan tanda & di belakang tipe data yang akan diacu. Berikut ini bentuk umum dari pembuatan reference.

tipe_data& nama_alias = nama_variabel;

Untuk dapat memahami lebih jauh mengenai reference ini, perhatikan contoh program di bawah ini.

Kode Program 6-14 #include <iostream>

using namespace std; int main() {

; int X; // Mendeklarasikan variabel X

// Membuat alias dari variabel X dengan nama AliasX int& AliasX = X;

/./ Mengisikan nilai ke dalam variabel X ;: x = 12 r

(12)

7/ Menampilkan nilai yang disimpan dalam variabel X dan

// AliasX

cout«"Nilai X : "«X«endl; cout«"Nilai AliasX : "«AliasX«endl ; cout«endl ;

// Mengisikan nilai ke dalam AliasX AliasX = 35;

// Menampilkan kembali nilai yang disimpan dalam variabel

// dan AliasX

cout«"Nilai X : "«X«endl; cout«'"Nilai AliasX : "«AliasX«endl ; return 0;

Hasil yang akan diperoleh dari program di atas adalah sebagai berikut : Nilai X Nilai AliasX Nilai X Nilai AliasX : 12 : 12 :35 :35

Apabila kita analisis hasil dari program di atas, tampak bahwa pada saat kita memasukkan nilai 12 ke dalam variabel X, AliasX juga akan bernilai 12. Begitu juga sebaliknya, pada saat kita memasukkan nilai 35 ke dalam AliasX, variabel X juga akan bernilai 35.

6.12.1 Alamat dari Reference

Perlu untuk diperhatikan bahwa sebuah alias dan variabel yang diacu tersebut menempati alamat yang sama di memori, jadi keduanya bukanlah dua buah variabel yang berbeda, melainkan satu variabel yang mempunyai dua nama. Untuk membuktikan hal ini, perhatikan program di bawah ini.

Kode Program 6-15 ttinclude <iostream>

using namespace std;

• int main()

// dengan nilai default 50

:// Membuat alias dari variabel X dengan nama AliasX

int& AliasX = X;

// Menampilkan nilai yang disimpan dalam variabel X dan

// AliasX

cout«"Nilai X : "«X«endl; »cout:«"Nilai AliasX : "«AliasX«endl;

cout«endl;

// Menampilkan alamat dari variabel X dan AliasX cout«"Alamat X : "«&X«endl; cout«"Alamat AliasX : "«&AliasX«endl; return 0;

Contoh hasil yang akan diberikan dari program di atas adalah sebagai berikut: Nilai X Nilai AliasX Alamat X Alamat AliasX : 50 : 50 :0065FEOO :0065FEOO Pemrograman

Seperti yang kita lihat bahwa alamat dari variabel X dan alamat dari AliasX adalah sama. Hal ini disebabkan karena keduanya merupakan objek yang sama sehingga alamat yang ditempatinya pun pasti akan sama.

6.12.2 Konstanta pada Reference

Dalam C + + , kita juga dapat mendefinisikan sebuah reference yang bersifat tetap (constant reference), artinya nilai dari reference ini tidak dapat diubah. Namun yang menjadi pertanyaan adalah apakah kita masih dapat mengubah nilai dari variabel yang diacu oleh reference tersebut, sedangkan reference tadi bersifat tetap? Jawabnya adalah 'ya', kita masih dapat memanipulasinya. Artinya yang menjadi konstanta di sini adalah hanya reference-nya,

(13)

sedangkan variabelnya tidak bersifat konstan. Hal ini memang sedikit membingungkan, namun sebagai bukti dari pernyataan di atas, coba Anda perhatikan program di bawah ini.

Kode Program 6-T6

tinclu.de <iostream> using namespace std; int main{) {

// Mendeklarasikan reference konstan

const intfc AliasX = X;

// Menampilkan nilai dari AliasX dan variabel X cout«"Nilai X : "«X«endl;

cout«"Nilai AliasX : "«AliasX«endl«endl; // Mengubah nilai X

X = 12; // BENAR, hal ini diperbolehkan karena X

// tidak bersifat konstan

// Menampilkan kembali nilai dari AliasX dan variabel X

cout«"Nilai X : "<<X«endl;

cout«"Nilai AliasX : "<<AliasX«endl«endl; // Mengubah nilai AliasX

// AliasX « ".25j.- // SALAH, hal ini tidak diizinkan

// oleh kompiler

Hasil yang akan diberikan dari program di atas adalah sebagai berikut: Nilai X Nilai AliasX Nilai X Nilai AliasX : 5 ,-: b : 12 : 12

BAB

7

ARRAY

7.1 Pendahuluan

Array adalah sebuah variabel yang menyimpan sekumpulan data yang memiliki tipe sama. Setiap data tersebut menempati lokasi atau alamat memori yang berbeda-beda dan selanjutnya disebut dengan elemen array. Elemen array itu kemudian dapat kita akses melalui indeks yang terdapat di dalamnya. Namun penting sekali untuk diperhatikan bahwa dalam C + + , indeks array selalu dimulai dari 0, bukan 1. Berikut ini gambar yang mengilustrasikan sebuah array. Nilai ke-1 Alamat ke-1 0 Nilai ke-2 Alamat ke-2 1 ... ... Nilai ke-N Alamat ke-N N

>• Nilai elemen array >. Alamat elemen array

Untuk mendeklarasikan sebuah array dalam C + + , kita harus menggunakan tanda [] (bracket). Adapun bentuk umum dari pendeklarasiannya adalah sebagai berikut:

tipe_data nama_array[jumlah_elemen];

(14)

Sebagai contoh jika kita ingin mendeklarasikan sebuah array (misalnya dengan nama LARIK) yang memiliki 25 elemen dengan tipe data int, maka pendeklarasiannya adalah seperti yang tampak di bawah ini.

Ruang memori yang dibutuhkan untuk pendeklarasian array tersebut adalah 100 byte, yang berasal dari 25 x 4 byte (4 merupakan ukuran dari tipe data int). Sedangkan cara yang digunakan untuk mengakses elemennya adalah dengan menuliskan indeksnya. Misalnya kita ingin mengambil nilai yang terdapat pada elemen ke-10 dan menampung nilai tersebut ke dalam sebuah variabel yang bertipe int juga (misal X), maka kita harus menuliskan sintaks di bawah ini.

Kenapa 9, bukan 10? Ingat, indeks array selalu dimulai dari 0 sehingga untuk mengakses elemen ke-10, maka indeks yang kita butuhkan adalah 10-1, yaitu 9.

7.2 Mengisikan Nilai ke dalam Elemen Array

Untuk mengisikan nilai ke dalam elemen-elemen array, kita dapat melakukannya langsung untuk setiap elemen, misalnya seperti berikut.

MO] :-,io

A [ l ] = 20 A [ 2 ] = 30

dst

Namun cara ini tidak direkomendasikan karena tidak efisien. Cara yang lebih umum dan banyak digunakan oleh para programmer untuk mengisikan nilai ke dalam elemen-elemen array adalah dengan menggunakan pengulangan (looping). Cara ini akan jauh lebih cepat dibandingkan cara manual seperti di atas. Sebagai contoh jika kita ingin melakukan pengisian 25 elemen array, maka kita dapat menuliskan sintaks seperti di bawah ini.

for (int C=0; C<25; C++) {

cout«"A[w«C«"] « "; cin»A[C];

Pemrograman

Berikut ini contoh program yang di dalamnya terdapat proses pengisian array dengan menggunakan proses pengulangan.

7.3 Menampilkan Nilai yang Terdapat pada

Array

Setelah memahami cara mengisikan nilai ke dalam elemen array, sekarang kita akan membahas bagaimana cara untuk mengakses atau menampilkan nilai-nilai tersebut. Konsepnya sama seperti di atas, kita akan menggunakan pengulangan untuk menampilkannya. Berikut ini program yang akan mengisikan dan menampilkan nilai yang terdapat pada elemen array.

Kode Program 7-2 ttinclude <iostream>

using namespace std; int m a i n ( ) {

// Mendeklarasikan array A dengan 5 buah elemen bertipe ini i n t A [ 5 ] ;

// Mengisikan nilai ke dalam elemen array cout«"Masukkan nilai yang diinginkan"«endl;

for (int C = 0 ; C<5; C + + ) {

cout«"A[ "«C«" ] = "; c i n » A [ C ] ;

(15)

// Menampil]

cout«"Menampilkan nilai yang telah dimasukkan"«endl; for (int J=0; J<5? J++) {

cout«"Nilai yang terdapat pada elemen ke-"; cout«J+l«" : "«A[J] «endl;

Contoh hasil yang akan diberikan dari program di atas adalah sebagai berikut:

Masukkan nilai yang diinginkan A[0] = 10

A[l] = 2 1 A[2] = 13 A[3] = 35 A[4] = 28

Menampilkan nilai yang telah dimasukkan Nilai yang terdapat pada elemen ke-1 : 10 Nilai yang terdapat pada elemen ke-2 : 21 Nilai yang terdapat pada elemen ke-3 : 13 Nilai yang terdapat pada elemen ke-4 : 35 Nilai yang terdapat pada elemen ke-5 : 28

7.4 Melakukan Inisialisasi Array

Pada saat kita mendeklarasikan sebuah array, kita dapat langsung melakukan inisialisasi nilai terhadap elemen-elemen array di dalamnya. Hal ini dimaksudkan untuk mengisikan nilai default pada eiemen array sehingga jika elemen bersangkutan tidak diisi dengan nilai baru, maka nilai yang digunakan adalah nilai yang telah ada. Adapun bentuk umum dari inisialisasi array adalah seperti yang tampak di bawah ini.

tipe_data nama_array[N] = { nilail, nilai2, ..., nilaiN }; Berikut ini adalah contoh program yang menunjukkan proses inisialisasi nilai pada elemen-elemen array.

Kode Program 7-3

#include <iostream> using namespace std;

.nt main{) {

// Mendeklarasikan array

// dan langsung menginisialisasi nilainya

int A[5] = { 10, 20, 30, 40, 50 };

// Menampilkan nilai yang terdapat pada elemen array cout«"Sebelum dilakukan perubahan nilai"«endl; cout«"A[0] = w«A[0]«endl;

cout«"A[l] = "«A[l]«endl; cout«"A[2] = tt«A[2]«endl; cout«"A[3] = "«A[3]«endl; cout«"A[4] = "«A[4]«endl; // Mengubah elemen ke-1 dan ke-2 •A[0] = 12;

A[l] = 25;

// Menampilkan kembali nilai yang terdapat pada elemen array cout«"Setelah dilakukan perubahan nilai"«endl;

cout«"A[0] cout«"A[l] cout«"A[2] cout«"A[3] cout«"A[4] return 0; >«A[0]«endl; V«A[1] «endl; '«A[2]«endl; V«A[3 ]«endl; x«A[4]«endl;

Hasil yang akan diberikan dari program di atas adalah sebagai berikut:

Sebelum dilakukan perubahan nilai 10

20 30 40 50

Setelah dilakukan perubahan nilai 12

25 30 40 50

(16)

Seperti yang kita lihat di atas bahwa elemen ke-3, 4 dan 5 tidak dilakukan perubahan sehingga nilai yang digunakan adalah nilai default.

7.5 Melakukan Pencarian pada Elemen Array

Salah satu permasalahan yang sering muncul pada saat kita menggunakan array adalah tuntutan untuk melakukan pencarian elemen array. Misalnya di jumsan kimia dari perguruan tinggi tertentu, terdapat sekumpulan data mahasiswa yang disimpan dalam sebuah array, kemudian kita akan melakukan pencarian data mahasiswa yang bernama Budi Raharjo dari array tersebut. Contoh lainnya adalah pencarian data rekening bank, serta masih banyak lagi yang lainnya. Kasus-kasus semacam ini banyak dijumpai jika kita telah berhubungan dengan data. Maka dari itu, pada bagian ini kita akan membahas bagaimana cara melakukan pencarian elemen tertentu pada sebuah array.

Berikut ini contoh program yang akan melakukan pencarian nilai dari sekumpulan data yang bertipe int.

Kode Program 7-4 #include <iostream>

using namespace std; int main( ) {

// Mendeklarasikan array

// dengan melakukan inisialisasi nilai ke dalamnya

int A[10] = {12, 24, 13, 25, 10, 13, 21, 20, 15, 18 } ; int BIL; // Variabel untuk menampung nilai yang akan

// dicari'

// Menampilkan nilai yang terdapat // pada elemen- elemen array di atas

for (int C=0, C<10; C++) { cout«A [ C ] «endl; }

cout«endl ;

// Memasukkan nilai yang akan dicari cout«"Masukkan nilai yang akan dicari // Melakukan pencarian data

for (int J=0; J<10; J++)r {

Pemrograman

if (A[jj == BID {

cout«"Nilai yang dicari terdapat pada indeks ke-««j;

break;

Contoh hasil yang diberikan dari program di atas adalah sebagai berikut : 12 24 14 25 10 13 21 20 15 18

Masukkan nilai yang akan dicari: 13 Nilai yang dicari terdapat pada indeks ke-5

Sebenarnya nilai 13 ditemukan pada elemen array ke-6, namun karena indeksnya dimulai dari 0, maka indeks yang akan diberikan untuk data tersebut adalah 5. Contoh lain yang dapat kita ambil untuk menerangkan proses pencarian di dalam sebuah array adalah program yang dapat menentukan suatu kata apakah merupakan palindrom atau bukan. Adapun yang dinamakan dengan palindrom itu sendiri adalah kata yang dibaca dari depan maupun dari belakang menghasilkan kata yang sama, misalnya KATAK, KODOK, dan masih banyak lagi lainnya. Adapun program yang dimaksud adalah sebagai berikut:

Kode Program 7-5 #include <iostream> #include <cstring> using namespace std; int main() { Bab 7: Array

(17)

/ Mendeklarasikan variabel untuk men

f kata yang akan diperiksa

char* S = "KATAK";

// Mendeklarasikan variabel j dan k

// untuk mendefinisikan indeks larik

int j, k;

// Melakukan inisialisasi terhadap variabel j da 1 = 0 ;

k = strlen(S) ;

// Melakukan pengecekan polindrom terhadap S while ( ( j <= k) && ( S [ j ] = S [ k - l ] ) ) {

if (j > k) {

cout«S«" merupakan kata palindrom"; } else {

cout«S«" bukan kata palindrom"; return 0 ;

Hasil yang akan diberikan dari program di atas adalah sebagai berikut:

KATAK merupakan kata palindrom

Namun jika kita mengganti nilai dari variabel S dengan nilai "KIMIA", maka program akan memberikan hasil seperti berikut.

KIMIA bukan kata palindrom

Sebagai tambahan dan latihan bagi Anda, berikut ini dituliskan sebuah contoh program yang akan melakukan pencarian nilai maksimum dan minimum dari sebuah array yang bertipe int. Adapun sintaks programnya adalah seperti yang tampak di bawah

mi.

Kode Program 7-6 ftinclude <iostream> :

using namespace std;.

int main{) {

// Mendeklarasikan sebuah array

// dan melakukan inisialisasi ke dalamnya

int A t l O ] = { 12, 34, 54, 32, 10, 67, 98, 11, 20, 22 } /* Mendeklarasikan variabel max dan min

untuk menampung nilai maksimum dan minimum */

int max = A[0], min = A[0] ; // Menentukan nilai maksimum for (int C=l; C<10; C++) {

if (A[C] > max) { max = A[C] ;

// Menentukan nilai minimum for (int c=l; c<10; C++) {

if (A[c] < min) { min = A [ c ] ;

// Menampilkan nilai maksimum dan minimum

// yang ditemukan dalam array

;COUt«"Nilai maksimum : w«max«endl; cout« "Nilai minimum : "«min; return 0;

Hasil yang akan diberikan dari program di atas adalah sebagai berikut:

Nilai maksimum : 98 Nilai minumum : 10

Apabila sebelumnya Anda telah mempelajari algoritma, maka Anda pasti telah mengetahui bahwa elemen larik dapat diurutkan dengan beberapa buah metode, diantaranya metode gelembung (bubble sort), maksimum-minimum (maximum-minimum sort), sisip (insertion sort), heap sort, dan masih banyak lagi yang lainnya. Di sini kita tidak akan membahas apa perbedaan dari metode-metode

(18)

pengurutan tersebut, melainkan kita hanya akan berkonsentrasi pada bagaimana C + + melakukan pengurutan sebuah array dengan menggunakan metode-metode tersebut. Namun, dalam buku ini kita akan membatasi pembahasan dengan menggunakan dua buah metode saja, yaitu metode gelembung dan metode maksimum-minimum. Alasannya adalah karena kedua metode ini merupakan metode yang sering digunakan dalam pemrograman.

Salah satu dari kegunaan suatu pengurutan data adalah untuk mempermudah dan mempercepat proses pencarian data. Untuk lebih memahaminya, perhatikan dua buah program di bawah ini yang masing-masing akan mengurutkan elemen array dengan metode gelembung dan maksimum-minimum.

7.6.1 Menggunakan Metode Gelembung

Kode Program 7-7 #include <iostream>

using namespace std; int main ( ) {

// Mendeklarasikan array dengan 7 buah elemen

// yang bertipe int

int A [ 7 ] ;

// Mendeklarasikan variabel-variabel bantu yang diperlukan int j, k, C, temp;

// Memasukkan nilai array

cout«"Masukkan nilai pada elemen array :"«endl; for (C=0; C<7; C++) {

cout«"A[ "«C<<" ] = w; cin»A[C] ; // Menampi 1 kan nilai sebelum diurutkan

cout«"\nNilai elemen array sebelum diurutkan :"«endl; for (C=0; C<7; C++) {

cout«"A[ "«C«"] = "«A[C]«endl;

Melakukan pengurutan elemen array dengan metode gelembunc

E o r ( j = 0 ; j < 6 ; j + + ) { for ( k = 7 ; ' - > 0 ; k--) { if (A[k.| < A [ k -temp - A[k]| Pemrograman C+^ A[k] = A[k-l] temp;

// Menampilkan nilai setelah diurutkan

cout«"\nNilai elemen array setelah diurutkan :"«endl; for (C=0; C<7; C++) {

cout«"A[w«c«"J = "«AtC]«endl; return 0 ;

Contoh hasil yang akan diberikan dari program di atas dalah sebagai berikut :

Masukkan nilai pada elemen array :

A[0] = 70 A[l] = 10 A[2] = 40 A[3] = 20 A[4] = 30 A[5] = 60 A[6] = 50

Nilai elemen array sebelum diurutkan

A[0] = 70 A[l] = 10 A[2] = 40 A[3] = 20 A[4] = 30 A[5] = 60 A[6] = 50

Nilai elemen array setelah diurutkan :

A[0] = 10 A[l] = 20 A[2] = 30 A[3] = 40 A[4] = 50 A[5] = 60 A[6] = 70 Bab 7: Array

(19)

7.6.2 Menggunakan Metode Maksimum-minimum

Kode Program 7-8 #include <iostream>

using namespace std? int main() {

I// Mendeklarasikan array dengan 7 buah elemen !// yang bertipe int

lint A[7];

// Mendeklarasikan variabel-variabel bantu yang diperlukan int j, k, C, temp;

I// Memasukkan nilai array

jcout«"Masukkan nilai pada elemen array :"«endl; ]for (C=0; C<7; C++) {

cout«"A["«C«" ] = "; cin»A[C]; •// Menampilkan nilai sebelum diurutkan

cout«" \nNilai elemen array sebelum diurutkan :"«endl; for {C=0; C<7; C++) {

cout«"A["«C«"] = "«A[C]«endl; // Melakukan pengurutan elemen array

// dengan metode maksimum-minimum

int jmaks, U=6;

for (j=0; j<6; j++) { jmaks = 0; for (k=l; k<=U; k++) { if (A[k] > A[jmaks]) { jmaks = k; temp = A[U] ; A[U] = A [jmaks] ; A [jmaks] = temp; U--;

/ Menampilkan nilai setelah diurutkan

cout«"\nNilai elemen array setelah diurutkan :"«endl for (C=0; C<7; C++) {

cout«"A[w«C«"] = "«A[C]«endl; return 0;

} >**4

Pemrograman

Contoh hasil yang akan diberikan dari program di atas adalah sebagai berikut:

Masukkan nilai pada elemen array :

A[0] = 6 A[2] = 7 A[3] = 2 A[4] = 5 A[5] = 1 A[6] = 4

Nilai elemen array sebelum diurutkan

A[0] = 6 A[2] = 7 A[3] = 2 A[4] = 5 A[5] = 1 A[6] = 4

Nilai elemen array setelah diurutkan

A[0] = 1 All] = 2 A[2] = 3 A[3] = 4 A[4] = 5 A[5] = 6 A[6] = 7

7.7 Array yang Bersifat Konstan

Nilai dalam elemen array dapat dibuat tetap, yaitu dengan mendefinisikannya sebagai konstanta. Caranya sama seperti pada saat kita membuat konstanta dari identifier, yaitu dengan menggunakan kata kunci const di depan nama array yang didefinisikan. Berikut ini contoh program yang menunjukkan hal tersebut.

(20)

Kode Program 7-9 tinclude <iostream>

using namespace std; int main() {

// Mendeklarasikan array yang bersifat konstan

const int A[5] = { 10, 20, 30, 40, 50 };

// Menampilkan nilai yang terdapat pada array A for (int C=0; C<5; C++) {

cout«"A[ "«c«"] = "«A[C]«endl;

return

Hasil yang akan diberikan dari program di atas adalah sebagai berikut: A[0] = 10 A[l] = 20 A[2] = 30 A[3] = 40 A[4] = 50

Nilai-nilai yang ditampilkan di atas akan bernilai tetap karena kita mendefinisikan array A tersebut dengan nilai konstan. Untuk membuktikan hal ini, coba Anda tuliskan program berikut.

Kode Program 7-10 tinclude <iostream>

using namespace std; int main()- {•

int C;

// Mendeklarasikan array yang bersifat konstan

const int A[5] = { 10, 20, 30, 40, 50 };

// Mengubah nilai pada elemen array menjadi 1, 2, 3, 4 dan 5 for (C=0; C<5; C++) {

A[C] = C+l;

Pemrograman

I

// Menampilkan nilai yang terdapat pada array A for (C=0; :.C<5; C++) {

cout«"A["«C«"] = "«A[C]«endl;

return 0;

Coba Anda perhatikan statemen for (C=0; C<5; C++) {

A[C] = C+l; // SALAH, tidak diizinkan oleh kompiler

Statemen A [ C ] = C + l ; di atas jelas akan menimbulkan kesalahan, karena berusaha untuk mengubah nilai dari elemen array yang didefinisikan sebagai nilai konstan.

7.8 Array Sebagai Tipe Data Bentukan

Dalam C+ + , array juga dapat digunakan sebagai tipe data bentukan seperti halnya struktur dan enumerasi. Untuk melakukan hal ini kita hams menggunakan kata kunci typedef, dimana berfungsi untuk memberikan nama lain dari array yang dideklarasikan. Berikut ini bentuk umum untuk membuat array sebagai tipe data bentukan.

typedef tipe_data nama_arrayCjxunlah_elemen];

Untuk lebih memahaminya, perhatikan contoh program di bawah ini dimana terdapat sebuah array yang didefinisikan sebagai tipe data bentukan.

finclude <iostream> using namespace std; int main() {

// Mendeklarasikan tipe data berbentuk array dengan nama // LARIK

typedef int LARIK[5];

// Menggunakan,tipe data LARIK // untuk mendeklarasikan variabel A LARIK A;

int C; // Variabel bantu untuk melakukan pengulangan

(21)

bel

// Mengisikan nil for (C=0; ;C<5; C++

MOO;

// Menampilkan nilai elemen yang terdapat pada variabel A for (C=0; C<5; C++) {

cout«"A["«C«"] = "«A[C]«endl;

Program di atas akan memberikan hasil seperti berikut. A[0] = 100

A[l] = 200 A[2] = 300 A[3] = 400 A[4] = 500

Seperti yang kita lihat di atas bahwa sebuah array dapat digunakan untuk mendeklarasikan variabel lain. Pada kasus ini kita membuat sebuah tipe data bentukan dengan nama LARIK, selanjutnya kita menggunakan tipe tersebut untuk mendeklarasikan variabel A. Apabila kita amati, sebenarnya kita dapat langsung mendeklarasikan variabel A tersebut dengan tipe array, yaitu dengan sintaks di bawah ini.

Mungkin Anda bingung kenapa harus dituliskan sebagai tipe data? Jawabnya adalah karena tipe tersebut dapat digunakan untuk mendeklarasikan variabel dengan cepat. Misalnya kita akan mendeklarasikan lima buah variabel (dengan nama A, B, C, D dan E) yang bertipe array dari tipe int dan terdiri dari 5 elemen, maka jika ditulis dengan deklarasi biasa, sintaksnya adalah seperti berikut.

int A [ 5 ] int B [ 5 ] int C [ 5 ]:

i n t D [ 5 ]

•BB

Namun, jika sebelumnya kita mendefinisikan sebuah tipe data yang berbentuk array (misalnya dengan nama LARIK), maka sintaksnya akan lebih mudah dan terlihat lebih rapi, yaitu seperti di bawah ini.

typedef LARIK[5] ; // Membuat tipe data LARIK A, B, C/ D, E; // Deklarasi variabel

7.9 Array dari Karakter

.n~E

Dalam C + + , kumpulan karakter disebut dengan string (teks). Dan untuk mendeklarasikan array dari tipe karakter kita tentu akan menuliskannya ke dalam bentuk umum seperti di bawah ini.

char nama_array[jumlah_elemen] ;

Dengan demikian, apabila kita ingin melakukan deklarasi variabel string (misalnya dengan nama TEKS) yang terdiri dari 5 buah

karakter, maka sintaksnya adalah sebagai berikut: char TEKS15] - { 'B' , 'U' , 'D' , 'I' , ' \0' };

Karakter terakhir, v \ 0 ' , disebut dengan karakter null, yaitu karakter yang digunakan sebagai terminator dari sebuah string di dalam C+ + .

Namun, karena bentuk tersebut susah untuk ditulis dan riskan terhadap terjadinya sebuah kesalahan, maka C+ + memperbolehkan kita untuk dapat menuliskan karakter-karakter tersebut dalam sebuah string yaitu dengan cara seperti di bawah ini.

char TEKS [5] = "BUDI";

Kita tahu bahwa ukuran dari tipe data char adalah 1 byte sehingga ukuran memori yang dibutuhkan untuk proses pendeklarasian array di atas adalah 5 byte, yaitu 4 byte untuk string "BUDI" dan 1 byte untuk karakter null. Untuk membuktikan hal di atas, perhatikanlah contoh program di bawah ini.

Kode Program 7-12 #include <iostream>

using namespace std; int main() {

// Mendeklarasikan array A dari tipe karakter char A[5] = { 'B','U','D','I','\0' }; // Mendeklarasikan B sebagai string •: char B[5] = "BUDI";

(22)

I// Menampilkan nill^fjjari elemen array A

[ f o r (int C=0; C<5;

cout«A[C] ;

lcout«endl ;

// Menampilkan nilai dari variabel B jcout«B;

|cout«"\n\n" ;

// Menampilkan ukuran dari A dan B |cout«"Ukuran A : "«sizeof (A) «endl ;

"Cout«"UkuraiLii£Li;,J "«sizeo

return 0;

Hasil yang akan diberikan dari program di atas adalah seperti yang terlihat di bawah ini.

BUDI BUDI

Ukuran A : 5 Ukuran B : 5

Seperti yang kita lihat bahwa kedua bentuk deklarasi di atas akan memberikan hasil yang sama, begitu juga dengan ukuran memori yang dibutuhkannya.

7.10 Array dari Struktur dan Struktur dari Array

Bagi kebanyakan programmer pemula terkadang istilah array dari Struktur (array of structure) dan Struktur dari array (structure of array) ini agak sedikit membingungkan. Sebenarnya konsepnya sederhana, array dari Struktur berarti kita mendeklarasikan sebuah array dimana nilai dari setiap elemennya bertipe Struktur. Sedangkan Struktur dari array berarti kita mendeklarasikan sebuah Struktur dimana anggota dari Struktur tersebut bertipe array.

Pemrograman C++

Untuk lebih memperjelas, berikut ini program yang di dalamnya terdapat sebuah array yang elemen-elemennya bertipe Struktur.

#include <iostream> using namespace std; int main() {

int C; // Mendeklarasikan variabel C

// sebagai indeks pengulangan

// Menderinisikan tipe data bertipe Struktur typedef struct SISWA {

long NIM; char Nama[25] ; char Kota[30];

// Mendeklarasikan array A dengan tipe SISWA // dan jumlah elemennya tiga

SISWA A [ 3 ] ;

// Mengisikan nilai pada elemen array for (C=0; C<3; C+ + ) {

cout«"NIM : "; ein»A[C] .NIM;

Nama : "; cin»A[C] .Nama; cin»A[C] .Kota;

// Menampilkan nilai yang telah dimasukkan

// ke dalam elemen array

for (C=0; C<3; C++) { cout«A[C] .NIM«endl; cout«A[C] .Nama«endl; cout«A[C] .Kota«endl; cout«' \n' ; return 0;

Contoh hasil yang akan diberikan dari program di atas adalah sebagai berikut:

NIM : 1 Nama : BUDI Kota : BANDUNG

(23)

NIM Nama Kota NIM Nama Kota 2 ARISTA CIREBON 3 LINDA BOGOR 1 BUDI BANDUNG 2 ARISTA CIREBON 3 LINDA BOGOR

Seperti yang kita lihat bahwa setiap elemen array A bertipe struktur yang mempunyai tiga anggota yaitu NIM, Nama dan Kota. Hal ini menyebabkan pada saat kita mengakses setiap elemen array tersebut, maka data yang diminta juga ada tiga.

Sekarang kita akan membahas mengenai struktur dari array (structure of array). Untuk lebih jelasnya, perhatikan program di bawah ini.

Kode Program 7-14 #include <iostream>

using namespace std; int main() {

// Mendeklarasikan struktur yang data anggotanya bertipe

// array

•struct STRUKTUR { int A [ 3 ] ; int B[3];

// Mendeklarasikan varlabel X yang bertipe STRUKTUR

STRUKTUR X; int C;

// Memasukkan nilai ke dalam variabt for (C=0; C<3; C++) {

'X.A[C] = C+l;

X.B[C] = (C+l) * 100;

// Menampilkan nilai yang telah dimasukkan ke dalam variabel // X for (C=0; C<3; C++) { cout«"X.A["«C«"j = "«X.A[C]«endl; cout«"X.B["«C«"] = w«X.B[C]«endl; COUt« ' \n' ; return 0 ;

Hasil yang akan diberikan dari program di atas adalah sebagai berikut : X. A[0] = 1 X.B[0] = 100 X.A[1] = 2 X.B[1] = 200 X.A[2] = 3 X.B[2] = 300

7.11 Array dari Pointer dan Pointer ke Array

Dalam C + + , elemen array dapat berbentuk pointer dan pointer juga dapat menunjuk ke tipe array. Anda tidak perlu bingung akan hal ini karena sebenarnya konsep yang dikandung di dalamnya sederhana. Apabila kita membuat array dari pointer, artinya kita mendeklarasikan pointer sebanyak jumlah elemen array yang ditentukan. Berikut ini contoh pendeklarasian array dari pointer.

* P [ 5 ] ; .;.-•:-: .fS" :

(24)

Sintaks di atas menunjukkan bahwa kita akan mempunyai 5 buah alamat memori yang akan ditunjuk oleh pointer P. Namun, tentunya P tidak memmjuk alamat-alamat tersebut secara sekaligus, melainkan harus kita atur terlebih dahulu dengan menggunakan operator new dan delete. Untuk lebih memahami hal ini, perhatikanlah program di bawah ini dengan teliti.

#include <iostream> using namespace std;

int main() {

// Mendeklarasikan array dari pointer int *P[5];

for (int C=0; C<5; C++) { P[C] = new int;

cout«P [ C ] «endl ; delete P;

Contoh hasil yang akan diberikan dari program di atas adalah sebagai berikut: 00682EB8 00682EC8 00683344 00683354 00683364

Sekarang apabila kita mendeklarasikan pointer ke array, itu artinya kita mendeklarasikan sebuah pointer yang akan digunakan untuk menunjuk ke variabel yang bertipe array. Berikut ini contoh

pendeklarasiannya. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ int A[5]; // Array yang terdiri dari lima buah elemen

//bertipe int

int *P * A; //Mendeklarasikan pointer P untuk menunjuk array A

Mungkin Anda bingung, kenapa ditulis P = A bukan P = &A? Hal ini disebabkan karena array sendiri adalah suatu pointer. Jadi sintaks di atas sama saja jika dituliskan seperti di bawah ini.

Pemrograman

int A [ 5 ] j

int *P = &A[0];

Sintaks tersebut berarti bahwa pointer P akan menunjuk ke elemen pertama array, yaitu A [ 0 ] . Untuk membuktikan hal tersebut, perhatikanlah program di bawah ini.

ttinclude <iostream> using namespace std; int main() {

int A [ 5 ] ; int *P = A;

cout«"Nilai &A[0] = "«&A[Q]«endl; cout«"Nilai P = "«P;

return 0;

Contoh hasil yang akan diberikan dari program di atas adalah sebagai berikut: Nilai &A[0] Nilai P = 0065FDEC = 0065FDEC

7.12 Array Multidimensi

Array multidimensi yaitu array yang terdiri dari beberapa subskrip array. Sebagai contoh, array 2 dimensi adalah array yang mempunyai 2 subskrip array, 3 dimensi mempunyai 3 subskrip array dan seterusnya. Array seperti ini sering digunakan untuk pemrosesan matrik. Pada bagian ini kita akan mempelajari bagaimana C++ dapat memproses sebuah array yang terdiri dari dua subskrip array atau lebih.

7.12.1 Array Dua Dimensi

Seperti yang telah dikemukakan sebelumnya bahwa array dua dimensi adalah array yang mempunyai dua buah subskrip, yaitu

(25)

baris dan kolom. Bentuk umum pendeklarasian sebuah array dua dimensi di dalam C + + adalah sebagai berikut:

tlpe_data

nama_array[jumlah_elemen_baris] [jumlah_elt _koiom] ;

Misalnya, jika kita akan melakukan penjumlahan 2 buah matrik ordo 3x2, maka contoh sintaks program yang akan kita tuliskan adalah seperti yang terlihat di bawah ini.

tinclude <iostream> using namespace std; int main ( ) {

// Mendefinisikan tipe data yang berbentuk array dua dimensi typedef int MATRIK32 [3][2J;

// Mendeklarasikan array A sebagai array dua dimensi MATRIK32 A, B, C;

Mendeklarasikan variabel untuk indeks pengulangan

//Mengisikan nilai ke dalam elemen-elemen array A for ( j = 0; j < 3 ;

for (k=0; k<2; k++) {

cout«"A[ "«j«."J [ "«k«"J = "; cin»A[ j ] [k] ;

// Mengisikan nilai ke dalam elemen-elemen array

f o r ( j = 0 ; j < 3 ;

for ( k = 0 ; k < 2 ; k + + ) {

= "; cin»B[ j ] [k] ;

// Melakukan penjumlahan A dan B

// dan menyimpan hasilnya ke dalam array C for (j=0; j<3;

for (k=0; k<2; k++) {

C [ j ] [ k ] = A [ j ] [k] + B [ j ] [ k ] ;

// Menampilkan hasil penjumlahan

[kj«en.'

return

Contoh hasil yang akan diberikan dari program di atas adalah sebagai berikut : A[0][0] = 1 A[0][l] = 2 A[2][0] = 5 B[0][0] = 1 B [ 0 ] [ l ] = 2 B[l][0] = 3 B[l][l] = 4 B[2][0] - 5 = 6 C[0][0] = 2 C [ 0 ] [ l ] = 4 = 6 = 8 C[2][0] = 10 C[2)[l] = 12

Secara matematis, contoh hasil dari program di atas dapat dituliskan seperti di bawah ini.

|~1 2"

3 4

5 6

+

"1 2~

3 4

5 6

=

"2 4 "

6 8

10 12

Bab 7: Array

(26)

7.12.2 Inisialisasi pada Array Multidimensi

Sama seperti array satu dimensi, pada array multidimensi juga dapat dilakukan inisialisasi nilai ke dalam elemen-elemennya. Adapun cara melakukannya adalah seperti contoh yang terlihat di bawah ini.

int A [ 3 ] [ 3 ] - { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 };

Namun, untuk memudahkan proses inisialisasi, C++ mengizinkan kita untuk melakukan pengelompokkan untuk setiap baris, yaitu dengan sintaks seperti berikut.

int A [ 3 ] [ 3 ] = { {1"}2,3},- { 4 , 5 , 6 } , ( 7 , 8 , 9 } }; ^: :;> Untuk membuktikan hal tersebut, perhaktian contoh program di bawah ini.

#include <iostream> using namespace std; int main{) {

// Melakukan inisialisasi nilai

// ke dalam elemen-elemen array dua dimensi intA[3][3] = { {1,2,3}, {4,5,6}, {7,8,9} };

// Mendeklarasikan variabel untuk indeks pengulangan int j, k;

// Menampilkan nilai yang tersimpan dalam elemen array I for (j=0; j<3; j++) {

for (k=0; k<3; k++) {

cout«"A[ "«j«" ] [ "«k«" ] = "«A[ j ] [k] «endl ; }

cout«endl;

return 0;

Hasil yang akan diberikan dari program di atas adalah sebagai berikut: A[0][0] = 1 A[0][l] = 2 A[0][2] = 3 Pemrograman A [ l ] [ 0 ] = 4 AHiri] = 5 A[l][2] = 6 A[2][0] = 7 A[2][l] = 8 A[2][2] = 9

Secara matematis, array di atas sebenarnya adalah sebuah matrik dengan ordo 3x3, yang dapat dituliskan seperti di bawah ini.

1 2 3 4 5 6 7 8 9

Referensi

Dokumen terkait

Modul praktikum ini berisikan materi praktikum struktur data yang telah dipelajari dalam perkuliahan teori, harapannya mahasiswa dapat memahami dan menerapkan struktur

Daftar Lampiran ... Latar Belakang ... Rumusan Masalah ... Tujuan Penelitian ... Struktur Organisasi Tesis... Hakikat Pembelajaran Bahasa Indonesia Ragam Tulis Formal di Sekolah

Hasil studi empiris menunjukkan bahwa banyak siswa menyelesaikan masalah matematika dengan penalaran imitatif daripada penalaran kreatif.. Siswa meniru prosedur

Pupuk cair LCN (Limbah Cair Nanas) yang digunakan dalam penelitian ini adalah limbah yang telah mengalami proses bioremediasi dengan memanfaatkan agen biologi berupa mikroba

pembudidaya di kelurahan Meruya Selatan atau tepatnya di kawasan Kayon, dengan bapak H.Gupron,…..saya mulai usaha penjualan dan budidaya sejak tahun 1980 sebelum dibangunnya

membuncah di dalam diri annabeth. Dibendungnya perasaan itu dengan paksa. Dia tidak boleh bersikap emosional. Iku anak Athena, kata Annabeth kepada dirinya sendiri. Aku

Novita Dianasari, 2012, Pengaruh CAR, ROE, LDR dan NPL terhadap Return Saham Serta Pengaruh Saat Sebelum dan Sesudah Publikasi Laporan Keuangan pada Bank Go Public di

Adapun dalam hal ini yang menjadi poin-poin yang observasi pada dasarnya diawali dengan argumen yang diberikan oleh informan pada saat wawancara, namun dalam hal ini sebagai