Berlangganan

About Me


VI ARRAY, STRING & POINTER

VI ARRAY, STRING & POINTER

6.1 ARRAY

      Array adalah kumpulan data-data beripe sama dan menggunakan nama yang sama. Dengan menggunakan rray, sejumlah variabel dapat memakai nama yang sama. Antara satu variabel dengan variabel yang lain di dalam array dibedakan berdasarkan subscript. Sebuah subscript berupa bilangan didalam tanda kurung siku. Melalui subscript inilah masing-masing elemen array dapat diakses. Nilai subscribe pertama secara default adalah 0.
      C++ tidak mengecek array. Bila anda menyatakan int x[10], ini artinya 10 elemen yang dimulai dari 0. Karena  itu elemen terakhir array adalah x[9]. Bila anda salah mereferensikannya dengan x[10], anda akan mendapatkan harga yang tidak terpakai. Akan lebih buruk lagi jika anda memberikan harga ke x[10], yang tidak dapat diterima.

6.1.1 Representasi Array
         Misalkan kita memiliki sekumpulan data ujian seorang siswa, ujian pertama bernilai 90, kemudian 95,78,85. Sekarang kita ingin menyusunnya sebagai suatu data kumpulan ujian seorang siswa. Dalam array kita menyusunnya sebagai berikut

     ujian[0] = 90;
     ujian[1] = 95;
     ujian[2] = 78;
     ujian[3] = 85;

Perhatikan :
·                     Tanda kurung [ ] digunakan untuk menunjukkan elemen array
·                     Perhitungan elemen array dimulai dari 0, bukan 1

      Empat pernyataan diatas memberikan nilai kepada array ujian. Tetapi sebelum kita memberikan nilai kepada array, kita harus mendeklarasikannya terlebih dahulu, yaitu :

      int ujian[4];

      Perhatikan bahwa nilai 4 yang berada didalam tanda kurung menujukkan
jumlah elemen array, bukan menunjukkan elemen array yang ke-4. Jadi elemen array ujian dimulai dari angka 0 sampai 3.
      Pemrogram juga dapat menginisialisasi array sekaligus mendeklarasikannya, sebagai contoh :

      int ujian[4] = {90,95,78,85};

      Elemen terakhir dari array diisi dengan karakter ‘\0’. Karakter ini memberitahu kompiler bahwa akhir dari elemen array telah dicapai. Walaupun pemrogram tidak dapat melihat karakter ini secara eksplisit, namun kompiler mengetahui dan membutuhkannya.
      Sekarang kita akan membuat daftar beberapa nama pahlawan di Indonesia
      char pahlawan[3][15] ;
      char pahlawan[0][15] = “Soekarno”;
      char pahlawan[1][15] = “Diponegoro”;
      char pahlawan[2][15] = “Soedirman”;

      Array diatas terlihat berbeda denga contoh array pertama kita. Perhatikan bahwa pada array pahlawan memilii dua buah tanda kurung [ ][ ]. Array seperti itu disebut array dua dimensi. Tanda kurung pertama menyatakan total elemen yang dapt dimiliki oleh array pahlawan dan tanda kurung kedua menyatakan total elemen yang dapat dimiliki setiap elemen array pahlawan. Dalam contoh diatas, tanda kurung kedua menyatakan karakter yang menyatakan nama pahlawan.

6.1.2 Menghitung Jumlah Elemen Array
         Karena fungsi sizeof() mengembalikan jumlah byte yang sesuai dengan argumennya, maka operator tersebut dapat digunakan untuk menemukan jumlah elemen array, misalnya

      int array[ ] = {26,7,82,166};
      cout<<sizeof(array)/sizeof(int); 

akan mengembalikan nilai 4, yaitu sama dengan jumlah elemen yang dimiliki array array.

6.1.3 Melewatkan Array Sebagai Argumen Fungsi
         Array dapat dikirim dan dikembalikan oleh fungsi
·         Pada saat array dikirim ke dalam fungsi, nilai aktualnya dapat dimanipulasi

Contoh :
#include <iostream.h>
void ubah(int x[]);
void main()
{
   int ujian[] = {90,95,78,85};
   ubah(ujian);
   cout<<" Elemen kedua dari array ujian adalah "<<ujian[1]<<endl;
}

void ubah(int x[])
{
   x[1] = 100;
}
  
Keluarannya : Elemen kedua dari array ujian adalah 100

6.2 POINTER

      Poiter adalah variable yang berisi alamat memori variable lain dan sevara tidak langsung menunjuk ke variable tersebut.
      Analoginya – sebagai contoh – Andi berteman dengan Budi, lalu anda ingin mengetahui jumlah keluarga Budi untuk keperluan sensus penduduk. Anda tidak mengetahui alamat Budi, tetapi anda mengenal Andi. Untuk mencari jumlah keluarga Budi, maka pertama-tama anda pergi kerumah Andi, misalnya dirumah no 8321. Sesampai di Andi, Andi membaritahukan kepada anda bahwa alamat Budi ada pada alamat 9821. Kemudian anda pergi ke rumah Budi lalu mencatat jumlah keluarga yang dimiliki Budi yaitu lima orang ( misalkan ).
      Dalam contoh diatas, Andi bertindak sebagai pointer. Andi tidak memberitahukan jumlah keluarga Budi, tetapi Andi memberitahu alamat Budi, di alamat 9821 ( alamat Budi ) itulah anda mengetahui jumlah keluarga Budi.
      Jika alamat dari ditunjukkan dengan simbol & dan isi dari ditunjukkan dengan symbol *, maka hubungan analogi diatas adalah:

Nama
Alamat
Isi
Andi
8321
9821 = &Budi
Budi
9821
5 = *(&Budi)

      Dalam bentuk pointer, ditulis :
      Andi = &Budi;  // baris 1
      Budi = *(&Budi);   // baris 2

      Subtitusi pernyataan di baris 2 :
       Andi = *Andi;

      Contoh program yang menggambarkan hal tersebut :
      #include <iostream.h>
      void main()
      {
          int *Andi; // Andi sebagai pointer
          int Budi = 5; // Budi bukan pointer, prhatikan perbedaan pada *
          Andi = &Budi // Isi dari Andi yaitu alamat Budi
          cout<<”Isi alamat memori Andi : “<<Andi<<endl;
          cout<<”Isi alamat memori Budi : “<<Budi<<endl;
          cout<<”Isi alamat memori Budi : “<<*Andi<<endl;
          cout<<”Alamat memori Andi : “<<&Andi<<endl;
          cout<<”Alamat memori Budi :”<<&Budi<<endl;
        }

        Keluarannya :
        Isi alamat memori Andi : 0x6da72448
        Isi alamat memori Budi : 5
        Isi alamat memori Budi : 5
        Alamat memori Andi : 0x6da7244a
        Alamat memori Budi : 0x6da72448

Penjelasan :
Isi alamat memori Andi adalah alamat memori Budi, yaitu 0x6da72448
( alamat ini berbeda-beda tergantung dari komputernya  dan ditulis dalam bentuk hexadesimal).
Sedangkan isi alamat memori Budi adalah 5. Cara mengakses isi dari alamat Budi ada dua cara, yaitu mengakses variabel Budi dan mengakses isi dari pointer Andi (*Andi). *Andi dapat juga disebut “isi dari alamat memori yang ditunjuk oleh Andi”. Karena alamat memori yang ditunjuk oleh Andi adalah alamat memori Budi, maka dapat dikatakan “isi dari alamat memori Budi”.

6.2.1 Pointer - Array
         Dalam 6.1 kita telah membahas array, sekarang kita akan melihat bagaimana data disimpan di memori dalam sebuah array.

Contoh :
#include <iostream.h>
void main()
{
   int n;
   int array[4] = {10,20,30,40};
   for(n=0;n<4;n++)
   {
      cout<<”Array[“<<n<<”] = “<<array[n]<<endl;
      cout<<”\tMenggunakan pointer = “<<*&array[n]<<endl;
      cout<<”\tDisimpan dalam “<<&array[n]<<endl;
    }
}

Keluarannya :
Array[0] = 10
           Menggunakan pointer = 10
   Disimpan dalam 0xdb72408
Array[1] = 20
Menggunakan pointer = 20
   Disimpan dalam 0xdb7240a
Array[2] = 30
Menggunakan pointer = 30
   Disimpan dalam 0xdb7240c
Array[3] = 40
Menggunakan pointer = 40
   Disimpan dalam 0xdb7240e
          


Penjelasan :
Seperti yang anda lihat, setiap array disimpan dalam 2 byte memori karena kita menggunakan tipe data integer. Perhatikan pula penggunaan pointer dalam pengaksesan nilai setiap elemen array dan pengaksesan alamat setiap array.

·         Alamat setiap elemen array dapat diperoleh dengan cara

&array[n]              atau      array+n

·         Isi dari setiap elemen array dapat diperoleh dengan cara

array[n]       atau      *(array+n)    


      Dibawah ini adalah contoh pengaksesan memori dan isi memori dengan menggunakan cara kedua

Contoh :
#include <iostream.h>
void main()
{
   int n;
   int array[4] = {10,20,30,40};
   for(n=0;n<4;n++)
   {
      cout<<”Array[“<<n<<”] = “<<array[n]<<endl;
      cout<<”\tMenggunakan pointer = “<<*(array+n)<<endl;
      cout<<”\tDisimpan dalam “<<array+n<<endl;
    }
}

Keluarannya :
Array[0] = 10
           Menggunakan pointer = 10
   Disimpan dalam 0xdb72408
Array[1] = 20
Menggunakan pointer = 20
   Disimpan dalam 0xdb7240a
Array[2] = 30
Menggunakan pointer = 30
   Disimpan dalam 0xdb7240c
Array[3] = 40
Menggunakan pointer = 40
   Disimpan dalam 0xdb7240e

      Mengapa hasil antara dua contoh diatas sama namun sintaksnya berbeda ? Karena array itu sebenarnya telah menunjuk ke alamat memori setiap elemennya, sehingga untuk mengetahui alamat memori setiap elemen array cukup dengan array + n dengan n bilangan bulat ( integer ).

6.2.2 Pointer - String
         String merupakan bentuk khusus dari array. Oleh karena itu operasi pointer-array tidak jauh berbeda dengan operasi pointer-string
Contoh :
#include <iostream.h>
void main()
{
     char nama[5] = “Andi”;
     cout<<”Nama awal : “<<nama<<endl;
     char *ptr;
     ptr = nama;
     *(ptr+3) = ‘y’;
     cout<<”Nama menjadi : “<<nama<<endl;
}

Keluarannya :
Nama awal : Andi
Nama menjadi : Andy

Jadi :
·         String adalah array (susunan) dari karakter-karakter
·         String dapat diakses dan dimanipulasi lewat pointer
·         Alamat awal dari string dapat diperoleh dari namanya

6.2.3 Pointer Sebagai Argumen String
        Jika pointer dikirim sebagai argument, maka nilai aktualnya dapat dimodifikasi.

Contoh :
#include <iostream.h>
void ubah(char *);
void main()
{
     char *ptr,nama[5] = “Andi”;
     ptr = nama; // ptr sebagai pointer ke variable nama
     cout<<”Nama awal : “<<nama<<endl;
     ubah(ptr);
     cout<<”Nama menjadi : “<<nama<<endl;
 }

void ubah(char *x)
{
  *(x+3) = ‘y’;
}

Keluarannya :
Nama awal : Andi
Nama menjadi : Andy

6.2.4 Alias
         Alias adalah nama lain dari suatu variable. Jika suatu perubaha terjadi pada variable alias maka akan berpengaruh kepada variable asli dan begitu juga sebaliknya.
Contoh :
#include <iostream.h>
void main()
{
   int uang =10000;
   int &duit = uang;
   cout<<”Nilai uang Rp.“<<uang<<endl;
   cout<<”Nilai duit Rp.“<<duit<<endl;
   uang = 9000;
   cout<<”Uang dibelikan es krim Rp.1000, nilainya menjadi Rp.“<<uang<<endl;
   cout<<”Nilai duit juga berubah menjadi Rp.“<<duit<<endl;
}

Keluarannya :
Nilai uang Rp.10000
Nilai duit Rp.10000
Uang dibelikan es krim Rp.1000, nilainya menjadi Rp.9000
Nilai duit juga berubah menjadi Rp.9000

Penjelasan :
Perubahan pada uang  menyebabkan perubahan pada duit karena duit memiliki alamat memori yang sama dengan uang. Jadi jika isi dari alamat memori uang atau duit berubah, maka nilai variable duit atau uang juga akan ikut berubah.

6.2.5 Argumen Baris Perintah
         Seringkali kita menggunakan perintah edit file.txt pada DOS, atau perintah vi file.txt pada Unix. Yang dimaksud dengan argumen baris perintah yaitu file.txt. Hal seperti itu dapat dibuat dengan menggunakan C++ dengan menyertakan argumen berikut pada fungsi main()

   void main(int argc, char *argv[])
           {
              …
           }
  
  atau

   main(int argc, char *argv[])
           {
              …
       return 0;
           }

Keterangan :
·         Argc       : Beisi jumlah parameter baris ditambah 1
·         Argv       : Berisi daftar nama argumen dan program, dengan rincian sebagai berikut :
Ø  argv[0] menunjuk nama program, lengkap dengan alamat path
Ø  argv[1] menunjuk argumen pertama ( kalau ada )
Ø  argv[n[ menunjuk argumen ke-n ( kalau ada)

Contoh :
// beri nama tes.cpp
#include<iostream.h>
void main(int argc, char *argv[])
{
     for(int a=0;a<argc;a++)cout<<”argv[“<<a<<”] = “<<argv[a]<<endl;
}   
Penjelasan :
Setelah dicompile dan di link akan muncul file tes.exe, misalkan anda simpan di d:\tes.exe
Buka command prompt, pindah ke direktori d:\ ketikkan
Tes argumen1 argument2 argument3, maka akan muncul tampilan

argv[0] = D:\TES.EXE
argv[1] = argument1
argv[2] = argument2
argv[3] = argument3
           
         Dibawah ini diberikan contoh penggunaan argumen baris perintah yang lain, supaya anda lebih memahami

Contoh :
// Program mengubah nilai desimal ke biner
// Simpan dengan nama dec2bin.cpp
#include <iostream.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
void main(int argc, char *argv[])
{
 if(argc !=2)
 {
   cerr<<"Pemakaian : dec2bin angka";
   exit(1);
 }
 int p = atoi(argv[1]),n,i=0;
 double A[100];
 do
 {
  A[++i]=p%2;
  p=p/2;
  floor(p);
 } while (p>1);
 cout<<"Nilai binernya : ";
 cout<<p;
 for(n=i;n>=1;n--)
 {
  cout<<A[n];
 }
 getch();
}
Jika anda ketikkan dec2bin 4, maka outputnya Nilai binernya : 100




2 Responses to "VI ARRAY, STRING & POINTER"