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 *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”;
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”;
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 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
ini gimana ambilnya .. nyuruh visitor ngetik mang ?? =))
ReplyDeleteseh iya gabsa di copy, curang :v
ReplyDelete