STTIKOM INSAN UNGGUL CILEGON KULIAH ALGORITMA DAN STRUKTUR DATA (BAHASA C++) Disusun oleh Pertemuan Substansi
: Subandi Wahyudi SSi : IV : Mahasiswa akan mengerti dan memahami pemakaian Pointer Struktur
sebagai
Pointer adalah suatu variabel yang menyimpan alamat dari suatu data, dan bukan menyimpan datanya sendiri. Jadi pointer tidak berisi nilai data, melainkan berisi suatu alamat memori. Lokasi memori tersebut bisa diwakili sebuah variabel atau juga berupa alamat memori secara langsung. Ilustrasi Kita memiliki variabel X yang berisi nilai karakter ‘a’ Oleh kompiler C, nilai ‘a’ ini akan disimpan di suatu alamat tertentu di memori. Nilai alamat variabel X dapat diakses dengan menggunakan statemen &X. Jika kita ingin menyimpan alamat dari variabel X ini, kita dapat menggunakan suatu variabel, misalnya alamat_x = &X; alamat_x adalah suatu variabel yang berisi alamat dimana nilai X, yaitu ‘a’ disimpan. alamat_x disebut variabel pointer atau sering disebut pointer saja. Sebagai contoh, jika px adalah pointer dan x adalah variabel yang ditunjuk oleh px, maka jika px berada pada alamat memori awal 1000, maka px akan berisi 1000, sedangkan datanya sendiri berupa nilai yang ada pada lokasi memori 1000.
Gambar 4.1 Variabel pointer px menunjuk ke variabel x. Deklarasi Variabel Pointer Variabel tipe pointer dideklarasikan dengan bentuk type *nama_variabel; atau Tipe_data *nama_variabel_pointer;
sebagai berikut:
Dengan tipe dapat berupa sembarang tipe data, sedangkan nama_variabel adalah nama dari variabel pointer. Sebagai contoh: int px; /* contoh1*/ char pch1, pch2; /*contoh2*/ Contoh pertama menyatakan bahwa px adalah variabel pointer yang menunjuk ke suatu data bertipe int. Pada contoh kedua, masing-masing variabel pch1 dan pch2 adalah variabel pointer yang menunjuk ke data bertipe char.
1
Gambar 4.2 Ilustrasi Pendeklarasian variabel pointer Contoh lain 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 ke rumah Andi, misalnya di rumah 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). 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 di atas adalah: Nama
Alamat
Isi
Andi
8321
9821 = &Budi
Budi
9821
5 = *(&Budi)
Contoh penggunaan pointer #include <stdio.h> void main() { char *alamat_x; //menyiapkan variabel alamat_x bertipe pointer to char char X; //menyiapkan variabel X bertipe karakter X = ; //mengisi variabel X dengan nilai alamat_x = &X; //mengisi variabel alamat_x dengan alamat X printf( Nilai variabel X, yaitu %c, disimpan pada alamat %p ,X,alamat_x); } Format “%p” digunakan untuk menampilkan alamat pointer!
Contoh lainnya #include <stdio.h> Void main() { float d, *pd; d = 54.6;
2
}
printf("Isi d semula = %g\n", d); pd = &d; *pd = *pd + 10; printf("Isi d kini = %g\n", d);
Pointer VS Variabel Biasa Variabel Biasa Berisi Data atau Nilai Operasi yang dilakukan seperti layaknya operasi biasa : +, - , /, *
Deklarasi int a ; Bersifat Statis Terdapat 2 buah operator pointer, yaitu: Operator * Mendapatkan nilai dari variabel pointer Operator &
data
Mendapatkan nilai alamat memori dari variabel pointer
Pointer Berisi alamat Memori dari suatu variabel tertentu Membutuhkan operator khusus : “&”yang menunjuk alamat dari suatu variabel tertentu. Operator “&” hanya dapat dilakukan kepada variabel dan akan mengahasilkan alamat dari variabel itu. Contoh: p = &n Yang kedua : Operator “*”. Operator ini bersifat menggunakan nilai dari alamat variabel yang ditunjuk oleh pointer tersebut. Contoh: int *p; Deklarasi int *a; Bersifat Dinamis Contoh int *alamat; int nilai = 10; alamat = &nilai; printf(“%d”,*alamat); Contoh int *alamat; int nilai = 10; alamat = &nilai; printf(“%p”,alamat);
Hasil: 10 Hasil: FFCCDD
Pemberian nilai, sebuah alamat dapat ditunjuk oleh lebih dari satu pointer
#include <stdio.h> void main() { float y,*x1,*x2; y = 12.34; x1 = &y; x2 = x1; //operasi pemberian nilai printf("nilai y pada x1 adalah %2.2f di alamat %p\n",y,x1); printf("nilai y pada x2 adalah %2.2f di alamat %p\n",*x2,x2); } Mengisi variabel dengan nilai yang ditunjuk oleh sebuah variabel pointer
#include <stdio.h> void main() { int *p,a=25,b; p = &a; b = *p;
3
}
printf("nilai a = %d di alamat %p\n",a,p); printf("nilai b = %d di alamat %p\n",b,p);
Mengoperasikan isi variabel dengan menyebut alamatnya dengan pointer
#include <stdio.h> void main() { int a=25,b=12; int *p,*q; p = &a; q = &b; printf("nilai yang printf("nilai yang *q = *p; printf("nilai yang printf("nilai yang }
ditunjuk p = %d di alamat %p\n",*p,p); ditunjuk q = %d di alamat %p\n",*q,q); ditunjuk p = %d di alamat %p\n",*p,p); ditunjuk q = %d di alamat %p\n",*q,q);
Mengisi dan mengganti variabel yang ditunjuk oleh pointer
#include <stdio.h> void main() { int a,*p; p=&a; *p=25; printf("nilai a = %d",a); } variabel pointer dapat dilakukan operasi aritmatika yang akan menunjuk suatu alamat memori baru. #include <stdio.h> void main() { char S[] = "Iwan"; char *p; //cara I p=S; //menunjuk alamat dari karakter pertama.
4
}
//cara 2 //p=&S[0]; //sama, menunjuk alamat dari karakter pertama for(int i=0;i<5;i++) { printf("%c",*p); p++; }
Pointer dan Array Hubungan antara struktur data pointer dan array dalam C sangatlah erat, sebab sesungguhnya array secara internal akan diterjemahkan dalam bentuk pointer. Contoh berikut akan memberi gambaran tentang hubungan antara pointer dan array. Misalnya dalam suatu fungsi dideklarasikan: dan static int tgl_lahir[3] = { 01, 09, 64 }; int *ptgl; -
Kemudian diberikan pernyataan ptgl = &tgl_lahir[0]; maka ptgl akan berisi alamat dari elemen array tgl_lahir yang berindeks nol. Instruksi di atas juga dapat ditulis menjadi: ptgl = tgl_lahir; sebab nama array tanpa tanda kurung menyatakan alamat awal dari array. Sesudah penugasan seperti di atas, maka *ptgl dengan sendirinya menyatakan elemen pertama (berindeks sama dengan nol) dari array tgl_lahir. Contoh di atas dapat dipahami melalui contoh program berikut ini.
Contoh I array #include <stdio.h> void main(){ int a[5] = {1,2,3,4,5}; int *p; p=a; printf("%d",*p); } Penjelasan: Pernyataan p=a artinya pointer p menyimpan alamat array a, yang alamatnya diwakili alamat elemen pertama, yaitu a[0] Kita juga dapat menuliskan baris p=a diganti dengan p=&a[0] Contoh II array Pembacaaan semua elemen array 1 dimensi dengan pointer #include <stdio.h> void main() { int a[5] = {1,2,3,4,5}; int *p; p=a; for(int i=0;i<5;i++) { printf("%d ",*p); p++; } } PENGISIAN ARRAY 1 DIMENSI #include <stdio.h> void main()
5
{
}
int a[5]; int *p; int i; p=a; for(i=1;i<=5;i++) { *p=i; p++; } for(i=0;i<5;i++) printf(“%d “,a[i]);
/* Pointer yang menunjuk array */ /* ------------------------------------------- */ #include <stdio.h> Void main() { static int tgl_lahir[] = {24, 6, 1965 }; int *ptgl; ptgl = tgl_lahir; /* ptgl berisi alamat array */ printf("Nilai yang ditunjuk oleh ptgl = %d\n", *ptgl); printf("nilai dari tgl_lahir[0] = %d\n", tgl_lahir[0]); } Contoh hasil eksekusi: Nilai yang ditunjuk oleh ptgl = 24 Nilai dari tgl_lahir[0] = 24 Contoh lain #include
void main() { int n; int array[4] = {10,20,30,40}; for(n=0;n<4;n++) { cout<< Array[ <
6
&array[n]
atau
array+n
Isi dari setiap elemen array dapat diperoleh dengan cara array[n] atau *(array+n) Di bawah ini adalah contoh pengaksesan memori dan isi memori dengan menggunakan cara kedua. Contoh : #include void main() { int n; int array[4] = {10,20,30,40}; for(n=0;n<4;n++) { cout<< Array[ < void main() { char a[3][5] = { "ABCDE","FGHIJ","KLMNO" }; char *p; p=&a[0][0]; for(int i=1;i<=3;i++) { for(int j=1;j<=5;j++) { printf("%c",*p); p++; } printf("\n"); } } Pointer sebagai struktur Anda dapat mempunyai karakter, integer, float bahkan pointer untuk dapat dijadikan sebagai tipe data anggota struktur. Sebagai contoh
7
#include void main() { struct kuliah { char kuliah1[30]; char kuliah2[30]; struct kuliah *ptr; }; kuliah semester[3] = {{"Komputer 207","Matematika 217",&semester[1]}, {"Electronic 210","Sistem Kendali 303",&semester[2]}, {"Analisis Numerik 301","Telekomunikasi 367",&semester[0]}}; int n; for(n=0; n<3;n++) { cout<<"Isi sedang menujuk ke : "; cout<<semester[n].ptr->kuliah1<<endl; } } Keluarannya : Isi sedang menunjuk ke : Electronic 210 Isi sedang menunjuk ke : Analisis Numerik 301 Isi sedang menunjuk ke : Komputer 207 Struktur juga bisa sebagai anggota struktur lainnya Struktur juga dapat menjadi anggota struktur lain. Contoh di atas juga salah satu contoh struktur sebagai anggota contoh. Untuk dapat lebih memahami di bawah ini diberikan sebuah contoh. #include void main() { struct anak {char pria[15]; char wanita[15]; }; struct keluarga { char suami[15]; char istri[15]; struct anak ; }; struct anak Andi = { Tedi Lisa } struct keluarga Budi = { Budi Ana Ryu Caecilia }; cout<< Anak laki-laki Andi < void main() {
8
}
int *Andi; // Andi sebagai pointer int Budi = 5; // Budi bukan pointer, perhatikan perbedaan pada * Andi = &Budi // Isi dari Andi yaitu alamat Budi cout<< Isi alamat memori Andi : <
Formatif 1. buat program untuk mengkonfersikan detik ke jam menit detik sebagai contoh 4545 detik menjadi 1 jam 15 menit 45 detik 2. buat program mencheck tanggal apakah yang dimaskukkan benar merupoakan tanggal contoh dalam format dd/mm/yyyy (hari, bulan, tahun), yang perlu perhatikan a. ada tahun kabisat (366 hari ) yaitu tahun yang habis di bagi 4 dan tidak habis dibagi 400 atau habis dibagi 100 , ini berakibat jumlah hari pada maret jadi 29 hari b. bukan tahun kabisat (365 hari) kebalikan di atas dan jumlah hari untuk bulan maret sama dengan 28 hari 3. buat program untuk selisih antara tanggal awal dan tanggal akhir
9