Struktur Data ( Data Structure ) – IS 2313

39
Imam Rozali, S.T., M.T. Struktur Data (Data Structure) – IS 2313

description

Imam Rozali , S.T., M.T. Struktur Data ( Data Structure ) – IS 2313. Chapter 2 : Pointer. Outline. KONSEP DASAR POINTER Pendeklarasian Variabel Pointer Mengatur Pointer Agar Menunjuk ke Variabel Lain Operasi pada Pointer Mengakses Isi Suatu Variabel Melalui Pointer - PowerPoint PPT Presentation

Transcript of Struktur Data ( Data Structure ) – IS 2313

Page 1: Struktur Data ( Data Structure )  – IS 2313

Imam Rozali, S.T., M.T.

Struktur Data(Data Structure) – IS 2313

Page 2: Struktur Data ( Data Structure )  – IS 2313

Chapter 2 : Pointer

Page 3: Struktur Data ( Data Structure )  – IS 2313

Outline

KONSEP DASAR POINTER Pendeklarasian Variabel Pointer Mengatur Pointer Agar Menunjuk ke Variabel Lain Operasi pada Pointer Mengakses Isi Suatu Variabel Melalui Pointer Tipe Variabel Pointer dan Tipe Obyek Yang Ditunjuk Pointer dan Array Array Dari Pointer Inisialisasi Array Pointer Pointer Menunjuk Pointer Pointer dan Struct Pointer dan Tipe Data String Pointer Sebagai Parameter Fungsi Pointer Sebagai Keluaran Fungsi

Page 4: Struktur Data ( Data Structure )  – IS 2313

KONSEP DASAR POINTER

Pointer (variabel penunjuk) adalah suatu variabel yang berisi alamat lokasi suatu memori tertentu.

Jadi isi dari variabel pointer merupakan alamat dari lokasi memori yang digunakan untuk menyimpan data dan bukan nilai data itu sendiri.

Page 5: Struktur Data ( Data Structure )  – IS 2313
Page 6: Struktur Data ( Data Structure )  – IS 2313

Jika variabel merupakan isi memori, dan untuk mengakses isi memori tersebut diperlukan address, lalu bagaimana cara kita mengetahui alamat dari suatu variabel ?

Page 7: Struktur Data ( Data Structure )  – IS 2313

Pendeklarasian Variabel Pointer

type *nama_variabel;

int px; /* contoh1*/char pch1, pch2; /*contoh2*/

Page 8: Struktur Data ( Data Structure )  – IS 2313

Mengatur Pointer Agar Menunjuk ke Variabel Lain

Agar suatu pointer menunjuk ke variabel yang lain, mula-mula pointer harus diisi dengan alamat dari variabel yang akan ditunjuk. Untuk menyatakan alamat dari suatu variabel, dapat digunakan operator & (operator alamat, yang bersifat unaray), dengan cara menempatkan operator di depan nama variabel.

Sebagai contoh, jika x dideklarasikan sebagai variabel bertipe int, maka &x berarti “alamat dari variabel x”.

Page 9: Struktur Data ( Data Structure )  – IS 2313

Adapun contoh pemberian alamat ke suatu variabel pointer px (yang dideklarasikan sebagai pointer yang menunjuk ke data bertipe int) yaitu:

Px = &x; Pernyataan di atas berarti bahwa px diberi nilai

berupa alamat dari variabel x. Setelah pernyataan tersebut dieksekusi barulah dapat dikatakan bahwa px menunjuk ke variabel x.

Page 10: Struktur Data ( Data Structure )  – IS 2313

Operasi pada Pointer

Operasi Penugasan Suatu variable pointer seperti halnya variable yang lain, juga

bisa mengalami operasi penugasan. Nilai dari suatu variable pointer dapat disalin ke variable pointer yang lain. Operator (&) dalam kaitannya dengan pointer adalah operator yang mengembalikan alamat memori dari operandnya.

Operasi Aritmatika Suatu variabel pointer hanya dapat dilakukan operasi aritmatika

dengan nilai integer saja. Operasi yang biasa dilakukan adalah operasi penambahan dan pengurangan. Operasi penambahan dengan suatu nilai menunjukkan lokasi data berikutnya (index selanjutnya) dalam memori. Begitu juga operasi pengurangan.

Page 11: Struktur Data ( Data Structure )  – IS 2313

Operasi Penugasan

int y = 5; /*deklarasi variabel y*/int *yPtr; /*deklarasi variabel pointer yPtr*/yPtr = &y; /*mengisi variabel pointer yPtr dengan alamat dari variabel y*/

Page 12: Struktur Data ( Data Structure )  – IS 2313

#include <stdio.h>Int main(){ Int i; Int *ia; i = 10; ia = &i; printf (“Alamat dari i adalah %p\n”,ia); printf (“Nilai i adalah %d\n”,i); printf (“Nilai dari pointer ia adalah %d\n”,*ia); *ia=50; printf (“Nilai I sekarang adalah %d\n”,i); printf (“Alamat dari i adalah %p\n”,&i); return 0;}

Page 13: Struktur Data ( Data Structure )  – IS 2313

Operasi Aritmatika

Asumsikan kita telah mendeklarasikan sebuah array float v[5], dan anggap elemen pertamanya berada pada lokasi 3000 di memori. Lalu kita deklarasikan sebuah variabel pointer *vPtr, ada dua cara untuk mengisi variabel pointer *vPtr dengan alamat dari elemen pertama array v, yaitu :

float *vPtr = v; float *vPtr = &v[0];

Page 14: Struktur Data ( Data Structure )  – IS 2313

Jika kita melakukan operasi aritmatika seperti:

dalam perhitungan aritmatika biasa, maka vPtr yang semula berisi 3000 menjadi 3000 + 2 = 3002, namun ini tidak berlaku pada pointer. Operasi aritmatika pada pointer di atas artinya adalah vPtr yang semula menunjuk pada v[0] sekarang menunjuk ke v[2].

 Karena vPtr menunjuk alamat memori dari variabel v yang bertipe float, maka vPtr sekarang berisi 3008 (3000 + 2 * 4).

vPtr += 2;

Page 15: Struktur Data ( Data Structure )  – IS 2313

#include <stdio.h>int main(){ float nilai[3], *petunjuk; nilai[0] = 220; nilai[0] = 641; nilai[0] = 53; penunjuk = &nilai[0]; printf(“Nilai %f ada di alamat %p\n”,*penunjuk,penunjuk); printf(“Nilai %f ada di alamat %p\n”,*(penunjuk+1),penunjuk+1); printf(“Nilai %f ada di alamat %p\n”,*(penunjuk+1),penunjuk+2);}

Page 16: Struktur Data ( Data Structure )  – IS 2313

Mengakses Isi Suatu Variabel Melalui Pointer

Jika suatu variabel sudah ditunjuk oleh pointer, maka variabel tersebut dapat diakses melalui variabel itu sendiri (disebut sebagai pengaksesan tak langsung), ataupun melalui pointer (disebut pengaksesan langsung).

Pengaksesan tak langsung dilakukan dengan menggunakan operator inderection berupa simbol * (bersifat unaray), seperti contoh berikut:

*px

yang menyatakan “isi atau nilai variabel/data yang ditunjuk oleh pointer px”. Sebagai contoh jika y bertipe int, maka sesudah dua pernyataan berikut:

px = &x;

y = *px;

y akan berisi nilai yang sesuai dengan nilai x.

Page 17: Struktur Data ( Data Structure )  – IS 2313

/* --------------------------------- *//* File program : Pointer.c *//* Contoh pemakaian pointer *//* -------------------------------- */#include <stdio.h>main(){int x,y; /* x dan y bertipe int */int *px; /* px pointer yang menunjuk obyek bertipe int */x = 87;px = &x; /* px berisi alamat dari x */y = *px; /* y berisi nilai yang ditunjuk px */printf("Alamat x = %p\n", &x);printf("Isi px = %p\n", px);printf("Isi x = %d\n", x);printf("Nilai yang ditunjuk px = %d\n", *px);printf("Nilai y = %d\n", y);}

Page 18: Struktur Data ( Data Structure )  – IS 2313

Tipe Variabel Pointer dan Tipe Obyek Yang Ditunjuk

Antara tipe pointer (sesuai dengan pendeklarasian pointer) dan tipe obyek yang akan ditunjuk oleh pointer haruslah sejenis. Jika misalnya pointer pu dimaksudkan untuk menunjuk data bertipe int maka data yang akan ditunjuk oleh pointer pu juga harus bertipe int. Suatu kesalahan akan terjadi jika misalnya pointer float digunakan untuk menunjuk data bertipe int.

Page 19: Struktur Data ( Data Structure )  – IS 2313

Mengubah Isi Suatu Variabel Melalui Pointer

Mula-mula pd dideklarasikan sebagai pointer yang menunjuk ke suatu data bertipe float dan d sebagai variabel bertipe float. Selanjutnya dengan ungkapan:

d = 54.6;

digunakan untuk mengisikan nilai 54.6 secara langsung ke variabel d. Perintah :

pd = &d;

digunakan untuk memberikan alamat dari d ke pd. Dengan demikian pd menunjuk ke variabel d.

Sedangkan pernyataan berikut:

*pd = *pd + 10; (atau: *pd += 10;)

merupakan instruksi untuk mengubah nilai variabel d secara tak langsung.

Perintah di atas berarti “jumlahkan isi variabel yang ditunjuk oleh pd dengan 10 dan simpan hasilnya ke variabel tersebut”, atau identik dengan pernyataan:

D = d + 10;

Page 20: Struktur Data ( Data Structure )  – IS 2313

/* ---------------------------------- *//* File program : Pointer2.c *//* Pengubahan isi pointer *//* -------------------------------- */#include <stdio.h>main() { float d, *pd; d = 54.6; printf("Isi d semula = %g\n", d); pd = &d; *pd = *pd + 10; printf("Isi d kini = %g\n", d); }

Page 21: Struktur Data ( Data Structure )  – IS 2313

Pointer dan Array

Misalnya dalam suatu fungsi dideklarasikan:

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.

Page 22: Struktur Data ( Data Structure )  – IS 2313

/* ------------------------------------------- *//* File program : Pointer3.c */ /* Pointer yang menunjuk array *//* ------------------------------------------- */#include <stdio.h>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]); }

Page 23: Struktur Data ( Data Structure )  – IS 2313

Jika ingin menampilkan seluruh elemen array tgl_lahir, maka dapat digunakan perintah

for(i=0; i<3; i++) printf(“%d%, tgl_lahir[i]);

ptgl = tgl_lahir;for (i=0; i<3; i++0 printf(“%d “, *(ptgl + i));

Page 24: Struktur Data ( Data Structure )  – IS 2313

Secara umum operasi pointer dapat diterangkan sebagai berikut. Misalkan a adalah suatu array, dan pa adalah pointer yang menunjuk array a, maka

*(pa + i)

akan menyatakan elemen array dengan indeks sama dengan i.

Page 25: Struktur Data ( Data Structure )  – IS 2313

Jika pa dideklarasikan sebagai

int *pa;

maka obyek dari pa adalah data int.Cara lain dalam menampilkan isi suatu array

yaitu dengan menaikkan isi variabel pointer dengan menggunakan operator ++.

*(ptgl + i)

dapat diganti menjadi

ptgl++

Page 26: Struktur Data ( Data Structure )  – IS 2313

Misalkan suatu instruksi:

int *pa;

int a[3];Sesudah pernyataan: pa = a;

Sesudah pernyataan: pa++;

Page 27: Struktur Data ( Data Structure )  – IS 2313

Array Dari Pointer

Suatu array dapat digunakan untuk menyimpan sejumlah pointer. Misal pernyataan:

char *namahari[10];

merupakan pernyataan untuk mendeklarasikan array pointer.

Page 28: Struktur Data ( Data Structure )  – IS 2313

Inisialisasi Array Pointer

Static char *namahari[ ] ={ “Senin”, “Selasa”,“Rabu”,“Kamis”, “Jum’at”,“Sabtu” ,“Minggu”};

Page 29: Struktur Data ( Data Structure )  – IS 2313

Pointer Menunjuk Pointer

int var_x;int *ptr1;int **ptr2;

Page 30: Struktur Data ( Data Structure )  – IS 2313

/* ------------------------------------------- *//* File program : Ptrptr.c *//* Contoh pointer menunjuk pointer *//* ------------------------------------------- */#include <stdio.h>main() {int var_x = 234; /* variabel int */ int *ptr1; /* pointer int */int **ptr2; /* pointer menunjuk pointer int */ptr1 = &var_x; /* ptr1 berisi alamat var_x */ ptr2 = &ptr1; /* ptr2 berisi alamat ptr1 *//* Mengakses nilai var_x melalui ptr1 */ printf("Nilai var_x = %d\n", *ptr1);/* Mengakses nilai var_x melalui ptr2 */ printf("Nilai var_x = %d\n", **ptr2);}

Page 31: Struktur Data ( Data Structure )  – IS 2313

Pointer dan Struct

Sama halnya seperti array, pointer dapat bertipe apa saja, bahkan tipe buatan kita sendiri.

Page 32: Struktur Data ( Data Structure )  – IS 2313

Pointer dan Tipe Data String

String adalah sekumpulan karakter-karakter yang membentuk suatu larik atau array. Suatu string dapat diakses elemen-elemen karakternya baik sebagai pointer ataupun sebagai larik.

char *P;P = “FASILAKOM”;

Page 33: Struktur Data ( Data Structure )  – IS 2313

Pointer:*P → ‘F'*(P+1) → ‘A’*(P+2) → ‘S’*(P+3) → ‘I’*(P+4) → ‘L’*(P+5) → ‘K’*(P+6) → ‘O’*(P+7) → ‘M’

Larik:P[0] → ‘F'P[1] → ‘A’P[2] → ‘S’P[3] → ‘I’P[4] → ‘L’P[5] → ‘K’P[6] → ‘O’P[7] → ‘M’

Page 34: Struktur Data ( Data Structure )  – IS 2313

#include <stdio.h> #include <string.h> #include <iostream.h> void main() { char *P; int i; P = "TELKOMPDC"; for (i=0; i<=7; i++) { cout<<"Nilai variabel (P+"<<i<<") = '"<<*(P+i)<< "' berada pada alamat = ";printf("%p",(P+i)); cout<<endl; } cout<<endl; for (i=0; i<=7; i++) { cout<<"Nilai variabel P["<<i<<"] = '"<<P[i]<< "' berada pada alamat = ";printf("%p", &P[i]); cout<<endl; } }

Page 35: Struktur Data ( Data Structure )  – IS 2313
Page 36: Struktur Data ( Data Structure )  – IS 2313

Pointer Sebagai Parameter Fungsi

Penerapan pointer sebagai parameter fungsi yaitu jika diinginkan agar nilai suatu variabel internal dapat diubah oleh fungsi yang dipanggil.

Contoh pemanggilan fungsinya adalah :

naikkan_nilai(&a, &b);

void naikkan_nilai (int *x, int *y){*x = *x + 2;*y = *y + 2;}

Page 37: Struktur Data ( Data Structure )  – IS 2313

Pointer Sebagai Keluaran Fungsi

Suatu fungsi dapat dibuat agar keluarannya berupa pointer.

Page 38: Struktur Data ( Data Structure )  – IS 2313

Char *nama_bulan(int n){ static char *bulan[ ] = { “Kode bulan salah”, “Januari”, “Pebruari”, “Maret”, “April”, “Mei”, “Juni”, “Juli”, “Agustus”, “September”, “Oktober”, “Nopember”, “Desember” }; return( (n<1 || n>12) ? bulan[0] : bulan[n] ); }

Page 39: Struktur Data ( Data Structure )  – IS 2313

/* ----------------------------------------------- *//* File program : Ptrbulan.c *//* Contoh fungsi dengan keluaran berupa *//* pointer yang menunjuk string *//* ----------------------------------------------- */#include <stdio.h>char *nama_bulan(int n);main(){ int bl; printf("Bulan (1 .. 12): "); scanf("%d", &bl); printf("%s\n", nama_bulan(bl));} char *nama_bulan(int n) { static char *bulan[] = { "Kode bulan salah", "Januari", "Pebruari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "Nopember", "Desember" }; return((n<1 || n>12) ? bulan[0] : bulan[n]);}