array dan pointer di c++
Embed Size (px)
TRANSCRIPT
-
7/23/2019 Array Dan Pointer di C++
1/44
BAB VI
ARRAY DAN POINTER
6.1 Karakter Array Dan String
C++ tidak mempunyai tipe variabel yang dapat dipakai untuk menyimpan suatu
string. Karena string merupakan kumpulan dari karakter-karakter maka string dapat
disimpan dalam suatu karakter array. Misal untuk menyimpan nama orang dapat dibuat
suatu karakter array sebagai berikut :
char nama[25];
Deklarasi suatu array selalu memakai tanda kurung [ ], yang bilangan didalamnya
menunjukkan jumlah tempat yang dipesan untuk array tersebut, jadi array nama di atas
akan dapat menampung 25 karakter. Suatu karakter array dapat langsung diberi suatu
nilai pada saat dideklarasi, misalnya:
char nama[25] = Slamet Rahardjo;
atau
char nama[] = Slamet Rahardjo;
Pada contoh di atas, pada saat array nama dideklarasikan, string Slamet Rahardjo
langsung disimpan di dalamnya. String dalam C++ selalu diakhiri dengan null charakter /
null zero sehingga untuk string Slamet Rahardjoyang terdiri dari 15 karakter maka
karakter ke 16 harus null zero. Pada contoh di atas karakter null zero langsung
ditambahkan oleh C++ seperti ditunjukan oleh gambar di bawah ini
nama[0] = S; // Subsript dimulai dari 0
nama[1] = l;
nama[2] = a;
-
7/23/2019 Array Dan Pointer di C++
2/44
nama[3] = m;
nama[4] = e;
nama[5] = t;
nama[6] = ;
nama[7] = R;
nama[8] = a;
nama[9] = h;
nama[10] = a;
nama[11] = r;
nama[12] = d;
nama[13] = j;
nama[14] = o;
nama[15] = 0; // null karakter atau null zero
Jadi string selalu diakhiri dengan null zero. String nama ini dapat ditampilkan dengan
perintah:
cout
-
7/23/2019 Array Dan Pointer di C++
3/44
nama[0] = S; // Subsript dirnulai dan 0
nama[1] = l;
nama[2] = a;
nama[3] = m;
nama[4] = e;
nama[5] = t;
nama[6] = ;
nama[7] = R;
nama[8] = a;
nama[9] = h;
nama[10] = a;
nama[11] = r;
nama[12] = d;
nama[13] = j;
nama[14] = o;
Karakter array namaini dapat juga dideklarasikan sebagai berikut :
char nama []= {S, l, a, m, e, t, , R, a, h, a, r, d, j, o}; Cara
terakhir ini lebih sering dipakai. Karena tanpa null zero maka yang disimpan dalam
karakter array nama adalah karatker, bukan string.
-
7/23/2019 Array Dan Pointer di C++
4/44
Dalam C++ nama dari suatu array adalah alamat dan elemen pertama dari array
tersebut, jadi misal kotaadalah suatu array maka:
kota == &kota[0]
kota dan &kota[0]mewakili alamat memori dari elemen pertama dari array kota. Dalam
C++ semua array dipassingkan by address. Jadi jika kita mempassingkan suatu array ke
suatu fungsi dan fungsi tersebut merubah array tersebut maka perubahan ini tetap berlaku
meskipun eksekusi sudah kembali ke fungsi yang memanggil. Hal ini dapat dilihat pada
contoh program di bawah ini
// C2_5.CPP
#include
#include
//c[] adalah suatu array
void ubah array(char c[]);
main()
{
char nama[4] = ABC;
ubah_array(nama); // Passing by address
cout
-
7/23/2019 Array Dan Pointer di C++
5/44
return;
}
6.2 Array
Array adalah sekumpulan elemen yang mempunyai satu jenis tipe data. Deklarasi
dari suatu array memberitahu kompiler berapa jumlah elemen yang dikandung oleh array
tersebut dan apa tipe data dari array tersebut. Contoh dari deklarasi array adalah:
main()
{
float gaji[50] // array 50 float
char nama[25] // array 25 karakter
int nomor[40] // array 50 integer
.
.
.
}
Masing-masing elemen dari suatu array diidentifikasi dengan subscript dari array
tersebut, subscript dari array ini juga disebut indek. Penomorannya mulai dari 0, sehingga
gaji[0] elemen pertama dari array gaji sedang gaji[49] adalah elemen ke 50 dari array
gaji. Inisialisasi suatu array dapat dilakukan dengan membuat list di dalam tanda kurung
{ } yang elemen-elemennya dipisahkan dengan koma misalnya:
int jml_hari[JML_BULAN] = {31,28,31,30,31,30,31,31,30,31,30,31};
-
7/23/2019 Array Dan Pointer di C++
6/44
Contoh program berikut ini menjelaskan pemakaian array untuk menampilkan jumlah
hari masing-masing bulan.
// C3_5.CPP
#include
#include
#define JML_BULAN 12
main()
{
int indek;
char bln[10];
int jml_hari[JML_BULAN]= (31,28,31,30,31,30,31,31,30,31,30,31);
for (indek=0; indek < JML_BULAN; indek++)
{
switch (indek+l)
{
case 1:
strcpy(bln, Januari);
break;
case 2:
strcpy(bln, Februari);
break;
case 3:
strcpy(bln. Maret);
-
7/23/2019 Array Dan Pointer di C++
7/44
break;
case 4:
strcpy(bln, April);
break;
case 5:
strcpy(bln, Mei);
break;
case 6:
strcpy(bln, Juni);
break;
case 7:
strcpy(bln, Juli);
break;
case 8:
strcpy(bln, Agustus);
break;
case 9:
strcpy(bln, September);
break;
case 10:
strcpy(bln, Oktober);
break;
case 11:
-
7/23/2019 Array Dan Pointer di C++
8/44
strcpy(bln, November);
break;
case 12:
strcpy(bln, Desember);
break;
}
cout
-
7/23/2019 Array Dan Pointer di C++
9/44
membuat variabel pointer pti menunjuk alamat memori milik elemen pertama dari int
array. Selanjutnya variabel pointer pti ini dapat ditambah dengan bilangan bulat tertentu
untuk mengakses elemen-elemen yang lain dari int_array seperti ditunjukkan pada contoh
program di bawah ini:
//C1_6.CPP
#include
#define DIMENSI 4
main()
{
int int_array[DIMENSI], *pti;
float float_array[DIMENSI], *ptf;
pti = int_array;
ptf = float_array;
cout
-
7/23/2019 Array Dan Pointer di C++
10/44
Program di atas mendeklarasikan array int_array yang elemen-elemennya adalah tipe
integer dan float_array yang elemen-elemennya tipe float. pti adalah pointer ke variabel
tipe integer dan ptf adalah pointer ke variabel tipe float. Output dari program ini pada
komputer saya adalah:
Array Integer Array Float
Pointer+0 8972 8942
Pointer+1 8974 8946
Pointer+2 8976 8950
Pointer+3 8978 8954
Pada program di atas pointer pti dan ptfditambah 1 lewat loop, bila ditampilkan dilayar
maka akan ditampilkan dalam sistem bilangan heksadesimal, Untuk keperluan
pembahasan program dilakukan casting pada kedua variabel pointer tersebut menjadi tipe
integer sehingga outputnya ditampilkan dilayar sebagai integer.
Alamat elemen pertama dari int_array yang mula mula diserahkan ke variabel
pointer ptiadalah 8972 sedang alamat elemen pertama dari float_array yang mula mula
diserahkan ke variabel pointer ptf adalah 8942. Selanjutnya pada pointer pti dan ptf
ditambah 1, hasilnya adalah:
8972 +1 = 8974 ?
8942 +1 = 8946 ?
Kalau kita manyadari bahwa tipe integer memerlukan satuan memori 2 byte dan tipe float
memerlukan satuan memori 4 byte maka persamaan di atas dapat dimengerti. Jadi C++
rnenambahkan satu satuan memori setiap kali kita menambah 1 ke pointer, karena itu kita
perlu mendeklarasikan objek apa yang akan ditunjuk oleh pointer tersebut untuk
-
7/23/2019 Array Dan Pointer di C++
11/44
memberitahu pada kompiler satuan memori dari objek tersebut. Misalnya pada program
di atas deklarasi
int *ptj;
int *ptf;
menyatakan bahwa pti adalah variabel pointer ke integer dengan satuan memori 2 byte
dan ptf adalah variabel pointer ke float dengan satuan memori 4 byte.
Operator * dapat dipakai untuk mengakses isi dari objek yang ditunjuk oleh suatu
pointer. Dengan cara yang sama elemen-elemen dari suatu array dapat diakses.
Jikajml_hariadalah suatu array maka
jml_hari + 3 = = &jml_hari[3] // alamatnya sama
*(jml_hari +3) = = jml_hari[3] // nilainya sama
Jadi kita punya dua notasi yang berbeda untuk melakukan hal yang sama. Perhatikan
bahwa *(jml_hari+3) tidak sama dengan *jml_hari+3 karena operator * mempunyai
prioritas yang lebih tinggi dan operator + sehingga *jml_hari+3 diartikan sebagai
(*jml_hari) + 3:
*(jml_hari+3)adalah nilai elemen ketiga dari array jml_hari
*jmlhari+3adalah nilai elemen pertama dari jml_hari ditambah 3
Program di bawah ini mengakses elemen-elemen dari array jml hari dengan operator *
// C2_6.CPP
#include
#deflne JML_BULAN 12
main()
-
7/23/2019 Array Dan Pointer di C++
12/44
{
int indek;
int jml_hari[JML_BULAN] = (3l,28,31,30,31,30,31,31,30,3l,30,31};
for (indek=0; indek < JML BULAN; indek++)
{
cout
-
7/23/2019 Array Dan Pointer di C++
13/44
cout
-
7/23/2019 Array Dan Pointer di C++
14/44
fungsi Jumlahadalah pointer ke integer dan sebuah integer. Dari sini dapat disimpulkan
bahwa
int *arr; sama dengan int arr[];
keduanya adalah pointer ke integer. Jika arr adalah pointer maka pernyataan
jml+=arr[i]; pada fungsi Jumlah adalah sama dengan jml += *(arr + i);. Fungsi
Jumlahini dapat pula ditulis dengan notasi pointer sebagai berikut:
int Jumlah(int *arr, int n)
{
int jml = 0;
for (int i = 0; i < n; i++)
{
jml += *arr; // atau jml += *arr++;
arr++;
}
return jml;
}
Bagaimana prioritas/hirarki dari operator pada operasi pointer *arr++? Contoh program
di bawah ini yang menjelaskan hal ini.
// C4_6.CPP
#include
int data_1[2] = {100, 300};
-
7/23/2019 Array Dan Pointer di C++
15/44
int data_2[2] = {100, 300};
main()
{
int *p1, *p2, *p3;
p1 = p2 = data_1;
p3 = data_2;
cout
-
7/23/2019 Array Dan Pointer di C++
16/44
untuk misalnya membuat array yang elemennya adalah pointer, pointer ke fungsi, array
yang elemennya adalah pointer ke pointer lain dan array yang elemenya adalah pointer ke
fungsi.
Berikut ini adalah contoh program yang mempunyai dua fungsi, fungsi pertama
menampilkan suatu array sedang fungsi kedua mengkalikan elemen-elemen dari suatu
array dengan nilai tertentu. Fungsi kedua ini melakukan operasi pada array yang
sebenarnya bukan copynya sehingga setelah fungsi ini selesai dipanggil array tersebut
sudah berubah isinya. Untuk menampilkan array pada fungsi pertama dipakai notasi array
sedang untuk mengkalikan elemen-elemen dari array pada fungsi kedua dipakai notasi
pointer.
// C5_6.CPP
#include
#define DIMENSI 5
void tampil_array(double ar[], int n);
void kali_array(double pengali, double ar[], int n);
main()
{
double dummy[DIMENSI] = {20.0, 17.66, 8.2, 15.3, 22.22};
tampil_array(dummy, DIMENSI),
kali_array(2.5, dummy, DIMENSI);
tampil_array(dummy, DIMENSI);
return 0;
}
void tampil_array(double ar[], int n)
{
-
7/23/2019 Array Dan Pointer di C++
17/44
cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout.precision(2);
for (int i=0; i < n; i++)
cout
-
7/23/2019 Array Dan Pointer di C++
18/44
C5_5 CPP
#include
#define DIMENSI 4
main()
{
char *ptc[DIMENSI];
ptc[0] = Biar ;
ptc[1] = bodoh ;
ptc[2] = asal ;
ptc[3] = kaya !;
for (int i=0; i < DIMENSI; i++)
cout
-
7/23/2019 Array Dan Pointer di C++
19/44
array yang masing-masing elemennya berupa array lebih dari satu dimensi yang lain.
Array multidimensi dapat diberi harga awal pada saat dideklarasi sebagai berikut:
int arr 2D[3][4] ={{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}};
Bagi C ++ cara diatas bukan satu-satunya cara untuk memberi harga awal pada array
multidimensi meskipun cara di atas lebih dianjurkan karena lebih sesuai dengan subskrip
dari array, dengan cara ini dengan mudah dapat diketahui nomor basis dari masing-
masing elemen. C++ memperbolehkan kita untuk menganggap array di atas sebagai arraysatu dimensi dan menginisialisasinya sebagai berikut :
int arr_2D[3][4] = {1, 2,3, 4, 5, 6, 7, 8, 9, 10, 11, 12}
Cara ini tidak dianjurkan karena dimensi array tidak tampak sehingga kita harus melacak
sendiri nomor baris dari masing-masing elemen.
Program berikut ini memakai array dua dimensi untuk menghitung curah hujan antara
tahun 1991-1995.
//Cl_7.CPP
#include
#define JML_BULAN 12
#define JML_TAHUN 5
main()
{
cout.setf(ios::fixed);
cout.setf(ios::showpoint);
-
7/23/2019 Array Dan Pointer di C++
20/44
cout.precision(2);
float sub_total, total;
// Jumlah curah hujan 1991-1995
float hujan[JML_TAHUN][JML_BULAN] = {
{260.1,205.7,172.2,106.7,53.3,45.72,5.1,7.6,27.9,58.4,154.9,188.0},
{233.7,248.9,111.8,83.8,55.9,20.3,10.2, 0.O,15.2,43.2,109.2,132.l},
{167.6,139.7,96.5,71.1,40.6,5.1,0.0,0.0,0.0,33.0,66.1,106.7},
{109.2,109.2,109.2,76.2,50.8,25.4,5.1,5.1,10.2,60.9,88.9,167.6},
{215.9,208.3,30.5,40.6,60.9,0.0,132.1,22.9,7,6,22.9,356,182.9}
};
int tahun, bulan;
cout
-
7/23/2019 Array Dan Pointer di C++
21/44
for (bulan=0; bulan < JML_BULAN, bulan++)
{
// Tiap bulan, jumlah curah hujan untuk semua tahun
for (tahun=0, sub_total=0; tahun < JML_TAHUN; tahun++)sub_total += hujan[tahun][bulan];
switch (bulan+1)
{
case 1:
cout
-
7/23/2019 Array Dan Pointer di C++
22/44
break;
case 7:
cout
-
7/23/2019 Array Dan Pointer di C++
23/44
}
Output dari program ini adalah:Tahun Curah hujan(mm)
1991
1992
1993
1994
1995
1285.62
1064.30
726.40
817.80
960.20
Curah hujan rata2 per tahun 970.86 mm
Curah hujan rata-rata perbulan (mm)
Januari
Februari
Maret
April
Mei
Juni
Juli
Agustus
September
197.30
182.36
104.04
75.68
52.30
19.30
30.50
7.12
12.18
-
7/23/2019 Array Dan Pointer di C++
24/44
Oktober
November
Desember
43.68
90.94
155.46
6.6 Pointer dan Array Multidimensi
Bagaimana hubungan antara pointer dan array multidimensi? Untuk menjawab
pertanyaan ini perlu diketahui lebih dulu bagaimana kompiler menangani array
multidimensi. Kita akan memakai array dua dimensi sebagai sarana untuk membahas hal
ini. Untuk array dua dimensi:
int dummy[4][2];
bagi programmer array dua dimensi ini divisualisasikan sebagai suatu tabel dengan
elemen-elemen array pada baris dan kolom yang dimulai dari nol sebagai berikut :
dummy[0][0] dummy[0][1]
dummy[1][0] dummy[1][1]
dummy[2][0] dummy[2][1]
dummy[3][0] dummy[3][1]
Sedang C++ menyimpan array dua dimensi ini di memori secara berurutan berdasar
urutan baris, jadi baris pertama akan ditempatkan dulu secara berurutan baru baris kedua
diproses, demikian seterusnya sehingga seluruh baris tersimpan secara berurutan di
memori. Untuk array dua dimensi di atas posisinya di memori adalah:
dummy
[0][0]
dummy
[0][0]
dummy
[0][0]
dummy
[0][0]
dummy
[0][0]
dummy
[0][0]
dummy
[0][0]
dummy
[0][0]
8512 8514 8516 8518 8520 8522 8524 8526
Tabel di atas menunjukkan bagaimana satu array dua dimensi disimpan di memori,
angka-angka dibawahnya adalah alamat memori untuk masing-masing elemen dari array
-
7/23/2019 Array Dan Pointer di C++
25/44
dua dimensi tersebut. Karena tipe dari elemen adalah integer maka masing-masing
elemen mendapat jatah 2 byte seperti terlihat pada alamat-alamat memori di atas. Sesuai
dengan konsep array multidimensi maka array dua dimensi di atas dapat dipandang
sebagai array satu dimensi yang elemen-elemennya berupa array satu dimensi yang lain
sebagai berikut:
dummy[0] dummy[1] dummy[2] dummy[3]
sehingga dummy[0], dummy[1], dummy[2] dan dummy[3] adalah array satu dimensi
yang elemen-elemennya terdiri dari 2 integer, dummy, nama dari array dua dimensi,
adalah alamat dari elemen pertama dari array itu. Elemen pertama ini adalah dummy[0]
yang merupakan array yang isinya 2 integer. Analisis berhubungan dengan sifat-sifat
pointer adalah:
1. karena dummy adala alamat dan elemen pertama dari array maka dummy
sama dengan &dummy[0]. Padahal dummy[0] adalah array satu dimensi yang isinya
2 integer sehingga dummy[0]sama dengan &dummy[0][0]yang merupakan alamat
dari elemen pertama dari array dummy[0], tipe dari elemen pertama ini adalah
integer. Dari sini dapat disimpulkan bahwa dummy[0]adalah alamat dari objek yang
besarnya 1 integer sedangkan dummy adalah alamat dari objek yang besarnya 2integer. dummydan dummy[0] mernpunyai nilai yang sama yaitu 8512.
2. meskipun nilai dummy sama dengan dummy[0] tapi dummy menunjuk
objek yang besarnya 2 integer sedang dummy[0] menunjuk objek yang besarnya 1
integer. Tampak bahwa dummy+1 tidak sama dengan dummy[0]+1 karena
rnenambah 1 pada pointer menghasilkan nilai yang besarnya satu satuan ukuran
memori dari objek yang ditunjuk. dummy+1= = 8516 sedang dummy[0]+1= 8514.
3. Untuk memperoleh isi dari alamat yang ditunjuk oleh suatu pointer dipakai
operator *. Karena dummy[0] adalah alamat dari dummy[0][0] == 8512 maka
*(dummy[0]) menghasilkan isi yang disimpan di dummy[0][0] yaitu sebuah integer.
Sedangkan *dummy menghasilkan isi yang disimpan di dummy[0] yaitu alamat dari
elemen pertama array satu dimensi yaitu &dummy[0][0]==8512. Untuk mengambil
-
7/23/2019 Array Dan Pointer di C++
26/44
isi yang disimpan di &dummy[0][0] operator * diapplikasikan sekali lagi schingga
**dummy adalah dummy[0][0]. Jadi dummy[0], &dummy[0][0] dan *dummy
menyatakan hal yang sama yaitu alamat 8512 dengan notasi yang berbeda.
Program berikut ini membuktikan kebenaran uraian di atas:
//C2_7.CPP
#include
main()
{
int dummy[4][2];
cout
-
7/23/2019 Array Dan Pointer di C++
27/44
&dummy[0][0] = 8512
*dummy = 8512
dummy+1 = 8516, dummy[0]+1 = 514
&dummy[0][0]+l = 8514, *dummy+1 = 8514
*(dummy+1) = 8516
Perhatikan bahwa *dummy+1 tidak sama dengan *(dummy+1). Pada *dummy+1
operator * dipakai untuk mengambil nilainya dulu baru ditambah. *dummy adalah
alamat dari sebuah integer yaitu alamat dari dummy[0][0]. Menambah I akan menaikkan
alamat ini dengan 2 byte sehingga *dummy+1menghasilkan alamat dari dummy[1][0].
Pada *(dummy+l) ditambah dulu baru diambil nilainya dengan operator *. Disini
dummy adalah alamat dari objek yang besarnya 2 integer. Menambah 1 akan menaikkan
alamat ini dengan 4 byte sehingga dummy+1 adalah alamat dari dummy[1] sehingga
*(dummy+1)menghasilkan alamat dari sebuah integer yaitu alamat dari dummy[1][0].
Hubungan antara array dan pointer ini ditunjukkan oleh tabel di bawah ini:
dummy dummy+1 dummy+2 dummy+3
dummy[0] dummy[1] dummy[2] dummy[3]
dummy
[0][0]
dummy
[0][1]
dummy
[1][0]
dummy
[1][1]
dummy
[2][0]
dummy
[2][1]
dummy
[3][0]
dummy
[3][1]
8512 8514 8516 8518 8520 8522 8524 8526
*dummy
*dummy+1
*dummy+2
Dengan melihat gambar di atas dapat disimpulkan:
dummy[0] = = &dummy[0][0] = = *dummy
-
7/23/2019 Array Dan Pointer di C++
28/44
dummy[1] = = &dummy[1][0] = = *(dummy+1)
dummy[2] = = &dummy[2][0] = = *(dummy+2)
dummy[3] = = &dummy[3][0] = = *(dummy+3)
Bila operator * dikerjakan maka diperolch hi. ingan:
*dummy[0] = = dummy[0][0] = = **dummy
*dummy[1] = = dummy[1][0] = = *(*(dummy+1))
*dummy[2] = = dummy[2][0] = = *(*(dummy+2))
*dummy[3] = = dummy[3][0] = = *(*(dummy+3))
Secara umum kita dapat menyatakan masing-masing elemen dengan memakai notasi
array dan notasi pointer sebagai berikut :
dummy[m][n] = = *(*(dummy+m)+n)
persamaan di atas mudah dimengerti karena *(dummy+m)adalah dummy[m] sehingga
nilai n ditambahkan ke array satu dimensi dummy[m].
Pertanyaan selanjutnya bagaimana kita dapat membuat fungsi yang dapat memproses
array multidimensi?. Untuk ini perlu dideklarasi dulu pointer yang kompatible dengan
array multidimensi tersebut. Pointer yang kompatibel dengan array dua dimensi dummy
adalah:
int (*pd)[2]
disini pd menunjuk pada array satu dimensi yang elemennya terdiri dari 2 integer jadi pd
bukan pointer ke integer. Tanda kurung diperlukan karena mempunyai prioritas yang
lebih tinggi dari *. Bila deklarasi pd adalah:
int *pd[2]
-
7/23/2019 Array Dan Pointer di C++
29/44
maka operator akan bekerja lebih dulu, menghasilkan pd adalah array yang isinya 2 objek
yang jenisnya sesuatu. Kemudian operator * membuat pd adalah array yang isinya 2
pointer ke objek yang jenisnya sesuatu. Selanjutnya tipe data int membuat pd adalah
array yang isinya 2 pointer ke objek yang jenisnya integer. Jadi deklarasi di atas
menghasilkan 2 pointer. Sedang deklarasi int (*pd)[2]menghasilkan 1 pointer ke suatu
array yang isinya 2 integer, bila pd adalah argumen dari suatu fungsi 2 dimensi maka
deklarasi argumen ini adalah :
int pd[ ][2]
tanda kurung yang kiri, yaitu yang kosong menunjukkan pd adalah pointer, pd ini
selanjutnya dapat dipakai untuk mengakses array dua dimensi yang akan diproses.
Untuk array yang dimensinya lebih besar dari dua, notasi pointer akan semakin
komplek. Dari sini dapat dimengerti mengapa pointer merupakan bagian C++ yang
dianggap sulit dipelajari. Misalnya untuk menuliskan argumen pjdanri fungsi 3 dimensi
deklarasinya adalah:
int penjualan[][4][5]
tanda kurung yang paling kiri umumnya dikosongkan, untuk menunjukkan pj adalah
pointer. Kalau kurung paling kiri diisi maka isinya akan diabaikan.
6.7 Fungsi Dan Array Multidimensi
Misal kita akan membuat fungsi yang akan memproses array dua dimensi. Ada
beberapa pilihan yang dapat diambil. Pilihan pertama, yang paling sering dipakai, adalah
merancang fungsi tersebut untuk secara ekplisit memproses array dua dimensi. Pilihan
kedua adalah merancang fungsi untuk memproses array satu dimensi dari masing-masingsubarray dari array dua dimensi tersebut. Pilihan ketiga dilakukan dengan memakai
fungsi yang pada pilihan kedua, hanya array dua dimensi tersebut diperlakukan sebagai
array satu dimensi, Ketiga pilihan ini akan dibahas satu per satu.
6.8 Fungsi Dua Dirnensi
-
7/23/2019 Array Dan Pointer di C++
30/44
Fungsi di bawah ini dirancang untuk secara ekplisit memproses array 2 dimensi.
Tujuannya sangat sederhana yaitu nilai dari masing-masing elemen dari array tersebut
dikali dua, Perhatikan argumen formal pertama dari fungsi Lipat_Dua() adalah int
ar[][4], tampak bahwa ar adalah pointer ke suatu array yang terdiri dari 4 integer.
Argumen formal kedua dari fungsi Lipat_Dua() adalah int n, yaitu jumlah baris dari
array dua dimensi yang diproses. Perhatikan bahwa di dalam fungsi Lipat_Dua(),
elemen-elemen dari array dua dimensi digandakan lewat dua for-loop bersusun sebagai
berikut:
for (int i=0; i < n; I++)
for (int j=0; j < 4; j++)
ar[i][j] * = 2;
Dari uraian terdahulu dapat dimengerti bahwa ar[i][j] == *(*(ar+i)+j), padahal *(ar + i)
== ar[i]sedangkan ar[i] == &ar[i][0] sehingga diperoleh hubungan:
ar[i][j] == *(&ar[i][0] + j)
Tampak bahwa array dua dimensi tersebut diproses per baris. Program berikutmenjelaskan pemakaian fungsi ini.
// C5_7.CPP
#include
Lipat_Dua(int ar[][4], int n);
main()
{
int dummy[3][4] = {{2, 4, 5, 8},
{3, 5, 6, 9},
{12, 10,8,6}};
-
7/23/2019 Array Dan Pointer di C++
31/44
Lipat_Dua(dummy, 3);
for (int i = 0; i < 3; i++)
{
for (int j=0; j < 4; j++)
cout
-
7/23/2019 Array Dan Pointer di C++
32/44
dimensi tersebut dipassingkan ke fungsi untuk digandakan. Proses ini ditujukkan oleh
for-loop di bawah ini:
for (i=0; i < 3; i++)
Lipat_Dua(dummy[i][4];
Dummy[i] adalah &dummy[i][0] yaitu alamat dan elemen pertama dari masing-masing baris pada array dua dimensi yang diproses.
-
7/23/2019 Array Dan Pointer di C++
33/44
// C3_7.CPP
#include
Lipat_Dua(int ar[], int n);
Main()
{
int dummy[3][4] = {{2, 4, 5, 8},
{3, 5, 6, 9},
{12, 10,8,6}};
int i,j;
for (i=0; i < 3; i++)
Lipat_Dua(dummy[i], 4);
for (i=0; i
-
7/23/2019 Array Dan Pointer di C++
34/44
ar[i] *= 2;
}
6.10 Fungsi Satu Dimensi Diaplikasikan ke Array Dua Dimensi
Dengan fungsi yang sama dengan program di atas, array dua dimensi
dummy[3][4]diperlakukan sebagai array satu dimensi dengan 3 * 4 = 12 integer.
Argumen yang dipassingkan ke fungsi tersebut pada saat dipanggil adalah ar[0], artinya
pointer yang dipassingkan ke fungsi adalah &ar[0][0], perhatikan bahwa argumen kedua
adalah jumlah baris dikali jumlah kolom dari array dua dimensi yang diproses. Jadi pada
saat diproses:
ar[0] = = ar[0][0]
ar[1] = = ar[0][1]
ar[2] = = ar[0][2]
ar[3] = = ar[0][3]
ar[4] = = ar[1][0]
ar[5] = = ar[1][1] ... dst.
Listing program selengkapnya adalah sebagai berikut:
// C4_7.CPP
#include
Lipat_Dua(int ar[], int n);
main()
{
int dummy[3][4] = {{2, 4,3~8},
-
7/23/2019 Array Dan Pointer di C++
35/44
{3, 5, 6, 9},
{12, 10,8,6}};
Lipat_Dua(dummy[0], 3*4);
for (int i=0; i
-
7/23/2019 Array Dan Pointer di C++
36/44
int (*h)(char*);
Contoh yang lain, misal ada fungsi yang dipakai untuk membandingkan 2 integer dan ada
sebuah pointer yang dapat dipakai untuk memanggil fungsi itu:
int banding_int(int *obj1, int *obj);
int (*call_fungsi)(int *, int *);
maka alamat dari fungsi banding_int()dapat dipasangkan ke pointer call_fungsi dengan
pernyataan:
call_fungsi = banding_int;
Bagaimana caranya menulis suatu pointer yang dapat dipakai untuk mengakses fungsi--
fungsi yang dapat membanding dua buah objek yang tipenya bervariasi?. Disini kita perlu
void pointer karena void pointer atau pointer to void dapat dipakai untuk menunjuk
sembarang objek. Perhatikan pernyataan-pernyataan sebagai berikut:
char *cp; // pointer to character
void *vp; // pointer to void
vp = cp; // character pointer to void pointer
cp = (char *)vp; // void pointer to character pointer, harus lewat casting
Selanjutnya dapat ditulis pointer yang dapat dipakai untuk mengakses fugsi-fungsi yang dapat membandingkan 2 objek yang berbeda, misalnya:
int banding_int(void *obj1, void *obj);
int banding_char(void *obj1, void *obj2);
int banding_dbl(void *obj1, void *obj2);
int (*call_fungsi)(void *, void *);
-
7/23/2019 Array Dan Pointer di C++
37/44
Pointer call_fungsi dapat diarahkan untuk mengakses fungsi banding_int() atau
banding_char() atau banding_dbl() lewat fungsi bandingkan() yang deklarasinya
sebagai berikut:
int bandingkan(int type, void *obj1, void *obj2)
{
int (*call_fungsi)(void *, void *);
switch (type)
{
case INTEGER:
call_fungsi = banding_int;
break;
case CHARACTER:
call_fungsi = banding_char;
break;
case DOUBLE:
call_fungsi = banding_dbl;
break;
default:
return 0;
}
-
7/23/2019 Array Dan Pointer di C++
38/44
return ((*call_fungsi)(obj1, obj2));
}
Jadi bila 2 objek yang dibanding tipenya integer maka pointer call_fungsi akan menunjukfungsi banding_int() sehingga ekpresi (*call fungsi) dapat digantikan dengan
banding_int()sehingga pada fungsi di atas:
return ((*call fungsi)(obj1, obj2));
sama dengan
return (banding_int(obj1, obj2));
Contoh program di bawah ini menjelaskan proses di atas
// C6_7.CPP
#include
#define INTEGER 0
#define CHARACTER 1
#define DOUBLE 2
int banding_int (void *obj1, void *obj2);
int banding_char (void *obj1, void *obj2);
int banding_dbl(void obj1, void *obj2);
int bandingkan(int type, void *obj1, void *obj2);
main()
{
int a=20, b=20;
char c=z, d=a;
-
7/23/2019 Array Dan Pointer di C++
39/44
double e=1.414, f=1.732;
cout
-
7/23/2019 Array Dan Pointer di C++
40/44
default:
return 0;
}
return ((* call_fungsi)(obj 1, obj2));
}
int banding_int(void *obj1, void *obj2)
{
int hasil;
hasil = *(int *)obj1 - *(int *)obj2;
if(hasil < 0)
return - 1;
else
if (hasil = = 0)
return 0
else
if(hasil > 0)
return 1;
int banding_char(void *obj1, void *obj2)
{
int hasil;
hasil = *(char *)obj1 - *(char *)obj2;
if (basil < 0)
return -1;
-
7/23/2019 Array Dan Pointer di C++
41/44
else
if (hasil == 0)
return 0;
else
if (hasil > 0)
return 1;
}
int banding_dbl(void *objl, void *obj2)
{
double hasil;
hasil = *(double *)objl - *(double *)obj2;
if (hasil < 0)
return - 1;
else
if (hasil = = 0)
return 0;
else
if (hasil > 0)
return 1;
}
Pada persoalan di atas kita dapat juga menyelesaikannya dengan mendeklarasi array yang
elemen-elemenya adalah pointer ke fungsi. sebagai berikut:
int (*call_fungsi[3])(void *, void *);
-
7/23/2019 Array Dan Pointer di C++
42/44
lalu masing-masing elemen dari array di atas dipakai untuk menunjuk fungsibanding int(), banding_char() dan banding_dbl() sebagai berikut:
call_fungsi[0] = banding_int;
call_fungsi[1] = banding_char;
call_fnngsi[2] = banding_dbl;
C++ memperbolehkan lebih dari satu fungsi mempunyai nama yang sama.Fungsi-fungsi yang mempunyai nama sama ini dikenal sebagai overloadedfunctions. Overloaded artinya satu nama mernpunyai lebih dan satu arti. Bilaoverloaded functions dipanggil maka fungsi mana yang dipanggil ditentukan olehtipe dan argumen-argumen yang dipakai untuk memanggil fungsi tersebut.
Contoh program di atas dapat ditulis dengan sangat sederhana denganmenggunakan fasilitas ini.
// C7_7 CPP
#include
int banding(int obj1, int obj2);
int banding(char obj1, char obj2);
int banding(double obj1, double obj2);
main()
{
int a=20, b=40;
char c=z, d=a;
double e=l.414, f=1.732;
cout
-
7/23/2019 Array Dan Pointer di C++
43/44
cout
-
7/23/2019 Array Dan Pointer di C++
44/44
else
if (hasil == 0)
return 0;
else
if (hasil > 0)
return 1;
}
int banding(double obj1, double obj2)
{
double hasil;
hasil = obj1 - obj2;
if (hasil < 0)
return -1;
else
if(hasil = = 0)
return 0;
else
if(hasil > 0)
return 1;
}