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;

    }


Top Related