Pointer

Post on 05-Jan-2016

58 views 1 download

description

Pointer. Informatique Engineering Ahmad Dahlan University May 17, 2004. Pendahuluan. Pointer merupakan salah satu jenis data terstruktur Dengan menggunakan pointer, suatu variabel dapat diciptakan atau dihapus selama pengeksekusian program,  variabel (objek) dinamis - PowerPoint PPT Presentation

Transcript of Pointer

Pointer merupakan salah satu jenis Pointer merupakan salah satu jenis data terstruktur data terstruktur

Dengan menggunakan pointer, suatu Dengan menggunakan pointer, suatu variabel dapat diciptakan atau variabel dapat diciptakan atau dihapus selama pengeksekusian dihapus selama pengeksekusian program, program, variabel (objek) dinamis variabel (objek) dinamis

Untuk membuat struktur data Untuk membuat struktur data dinamis : dinamis : link list, queue, stack,link list, queue, stack, treetree ukurannya menjadi fleksibel ukurannya menjadi fleksibel

variabel yang menunjuk alamat variabel yang menunjuk alamat memory objek lain (menyimpan memory objek lain (menyimpan alamatalamat dari suatu objek dari suatu objek

variabel pointer variabel pointer bukan bukan berisi data berisi data

Objek Statis vs Objek DinamisObjek Statis vs Objek Dinamis

StatisStatis memori diperoleh memori diperoleh

secara otomatissecara otomatis memori dikembalikan memori dikembalikan

secara otomatis bila secara otomatis bila objek keluar dari objek keluar dari ruang lingkup tertentu ruang lingkup tertentu (fungsi, sebagai (fungsi, sebagai contoh)contoh)

int A[int A[1010]; // tertentu banyaknya]; // tertentu banyaknya

DinamisDinamis memori diperoleh dari memori diperoleh dari

operasi operasi newnew objek dinamis masih objek dinamis masih

ada (exist) di luar ada (exist) di luar fungsi di mana “dia” fungsi di mana “dia” dialokasikandialokasikan

objek di memori objek di memori hanya dapat dihapus hanya dapat dihapus dengan operasi dengan operasi deletedeleteint n;int n;cin >> n;cin >> n;

int *A = new int[int *A = new int[nn];];

Memori Untuk Objek DinamisMemori Untuk Objek Dinamis

Diminta dari Diminta dari free memoryfree memory (dikontrol (dikontrol sistem operasi)sistem operasi)

Permintaan memori harus ditentukan Permintaan memori harus ditentukan : tipe dan banyaknya objek: tipe dan banyaknya objek

Jika memori tersedia : pointer ke Jika memori tersedia : pointer ke memori akan dikembalikanmemori akan dikembalikan

Jika tidak tersedia : pointer null akan Jika tidak tersedia : pointer null akan dikembalikandikembalikan

Definisi Variabel PointerDefinisi Variabel Pointer

Pointer yang menunjuk objek bertipe Pointer yang menunjuk objek bertipe int int

int *A;int *A; Pointer yang menunjuk objek bertipe Pointer yang menunjuk objek bertipe

char char char *B;char *B;

Pointer yang menunjuk objek yang Pointer yang menunjuk objek yang tipenya didefinisikn sendiri tipenya didefinisikn sendiri

Mahasiswa *Ahmad;Mahasiswa *Ahmad;

Cara penulisan pada C++Cara penulisan pada C++ Contoh pointer yang tidak diberi nilai awalContoh pointer yang tidak diberi nilai awal

int *iPtr; // iPtr pointer menunjuk objek bertipe intint *iPtr; // iPtr pointer menunjuk objek bertipe intchar *s; // s pointer menunjuk objek bertipe charchar *s; // s pointer menunjuk objek bertipe charRational *rPtr; // rPtr pointer menunjuk objek RationalRational *rPtr; // rPtr pointer menunjuk objek Rational

Contoh pointer yang diberi nilai awalContoh pointer yang diberi nilai awalint i = 1;int i = 1;char c = 'y';char c = 'y';int *ptr; // ptr pointer menunjuk objek bertipe intint *ptr; // ptr pointer menunjuk objek bertipe intptr = &i; // ptr pointer menunjuk ke alamat iptr = &i; // ptr pointer menunjuk ke alamat ichar *t;char *t; // t pointer menunjuk objek bertipe char // t pointer menunjuk objek bertipe chart = &c; // t pointer menunjuk ke alamat ct = &c; // t pointer menunjuk ke alamat c

Gambaran PointerGambaran Pointer

int i = 1;int i = 1;

char c = 'y';char c = 'y';

int *ptr = &i;int *ptr = &i;

char *t;char *t;

t = &ct = &cptr

i ‘y’c

1

t

ijp

””This” dan “That”This” dan “That”

pointer boxpointer box dapat diibaratkan sebagai “this” dapat diibaratkan sebagai “this” (tanpa tanda star) (tanpa tanda star)

Kotak yang ditunjuk Kotak yang ditunjuk sebagai “that” (bintang)sebagai “that” (bintang)

int i = 1;int i = 1;int j = 2;int j = 2;int *p;int *p; // p pointer ke int // p pointer ke int

p = &i;p = &i; // "this" = alamat dari i// "this" = alamat dari i*p = 3;*p = 3; // "that" = 3// "that" = 3

p = &j;p = &j; // "this" = alamat dari j// "this" = alamat dari j*p = 4;*p = 4; // "that" = 4// "that" = 4

43

ijp

21

ijp

23

this

this

this

that

that

Indirection OperatorIndirection Operator Tanda Tanda ** menunjukkan bahwa : menunjukkan bahwa :

– Suatu objek merupakan pointerSuatu objek merupakan pointer

char char **kata;kata;– ** sebelum variabel bahwa yang diinginkan sebelum variabel bahwa yang diinginkan

adalah “that” (isi/objek yang ditunjuk)adalah “that” (isi/objek yang ditunjuk)

int i = 1, j;int i = 1, j;

int int **ptr; ptr; // ptr pointer ke int// ptr pointer ke int

ptr = &i; ptr = &i; // ptr menunjuk i// ptr menunjuk i

j = j = **ptr + 1;ptr + 1; // // **ptr ptr 1, sehingga j 1, sehingga j 22

cout << cout << **ptr << j << endl; ptr << j << endl;

// menampilkan : 12 (satu dua // menampilkan : 12 (satu dua bukan bukan dua dua belas)belas)

Alamat NullAlamat Null

null (= 0) adalah konstan pointer untuk null (= 0) adalah konstan pointer untuk suatu tipe tertentusuatu tipe tertentu

menunjukkan bahwa pointer belum menunjukkan bahwa pointer belum menunjuk ke objek tertentumenunjuk ke objek tertentu

tidak dapat merujuk kembali (de-tidak dapat merujuk kembali (de-reference)reference)

int *ptr;int *ptr;

ptr = ptr = NULLNULL;;

cout << *ptr << endl; // invalid, ptr tidak menunjuk cout << *ptr << endl; // invalid, ptr tidak menunjuk

// ke int yang valid// ke int yang valid

Member IndirectionMember Indirection

Pertimbangkan :Pertimbangkan :Rational r(4,3);Rational r(4,3);

Rational *rPtr = &r;Rational *rPtr = &r;

Memilih anggota secara langsung :Memilih anggota secara langsung :(*rPtr).Tampilkan();(*rPtr).Tampilkan();

Memilih anggota melalui pointer :Memilih anggota melalui pointer :rPtrrPtr->->Tampilkan();Tampilkan();

Perbandingan PenggunaanPerbandingan Penggunaan Penggunaan secara Penggunaan secara

tradisionaltradisional

void Tukar(void Tukar(char*char* y, y, char*char* z) { z) {char temp = char temp = **y;y;**y = y = **z;z;**z = temp;z = temp;

}}

int main() {int main() {char a = 'y';char a = 'y';char b = 'n';char b = 'n';Tukar(&a, &b);Tukar(&a, &b);cout << a << b << endl;cout << a << b << endl;return 0;return 0;

}}

Penggunaan pass by Penggunaan pass by referencereference

void Tukar(void Tukar(char&char& y, y, char&char& z) z) {{char temp = y;char temp = y;y = z;y = z;z = temp;z = temp;

}}

int main() {int main() {char a = 'y';char a = 'y';char b = 'n';char b = 'n';Tukar(a, b);Tukar(a, b);cout << a << b << endl;cout << a << b << endl;return 0;return 0;

}}

Aplikasi : Link ListAplikasi : Link List

class Node {class Node {public: public:

int data;int data;Node *berikut;Node *berikut;

};};//perintah//perintahNode *A = new Node;Node *A = new Node; A->data = 1;A->data = 1; A->berikut = 0;A->berikut = 0;

Node *B = new Node;Node *B = new Node; B->data = 2;B->data = 2; B->berikut = 0;B->berikut = 0; A->berikut = B;A->berikut = B;

1 0A 1A

2 0B

1

1

Bagaimana mengetahui isi list? (1)Bagaimana mengetahui isi list? (1)

Asumsi :Asumsi :

Node *jalan = A;Node *jalan = A;

while(jalan != 0) {while(jalan != 0) { cout << "Isi elemen : " << jalan->data << endl;cout << "Isi elemen : " << jalan->data << endl; ...???...???} }

1A 2 0

1A 2 0

jalan

1A 2 0

jalan Output :Output :Isi elemen : 1Isi elemen : 1

Bagaimana mengetahui isi list? (2)Bagaimana mengetahui isi list? (2)

Asumsi :Asumsi :

Node *jalan = A;Node *jalan = A;

while(jalan != 0) {while(jalan != 0) { cout << "Isi elemen : " << jalan->data << endl;cout << "Isi elemen : " << jalan->data << endl; jalan = jalan->berikut;jalan = jalan->berikut;} }

1A 2 0

1A 2 0

jalan

1A 2 0

jalan Output :Output :Isi elemen : 1Isi elemen : 1Isi elemen : 2Isi elemen : 2

*

jalan

Bagaimana mengetahui isi list? (3)Bagaimana mengetahui isi list? (3)

Asumsi :Asumsi :

Node *jalan = A;Node *jalan = A;

while(jalan != 0) {while(jalan != 0) { cout << "Isi elemen : " << jalan->data << endl;cout << "Isi elemen : " << jalan->data << endl; jalan = jalan->berikut;jalan = jalan->berikut;} }

1A 2 ?

1A 2 ?

jalan

1A 2 ?

jalan Output :Output :Isi elemen : 1Isi elemen : 1Isi elemen : 2Isi elemen : 2 Stop !!!Stop !!!

* *

?

Menghapus elemen pertama (1)Menghapus elemen pertama (1)

Asumsi :Asumsi : Node *hapus = new Node;Node *hapus = new Node;

hapus = A;hapus = A;

1A 2 ?

1A 2 ?

hapus

1

1

Menghapus elemen pertama (2)Menghapus elemen pertama (2)

Asumsi :Asumsi : Node *hapus = new Node;Node *hapus = new Node;

hapus = A;hapus = A;

A = A->berikut;A = A->berikut;

1A 2 ?

1

A

2 ?

hapus

1

2

1

2

Menghapus elemen pertama (3)Menghapus elemen pertama (3)

Asumsi :Asumsi : Node *hapus = new Node;Node *hapus = new Node;

hapus = A;hapus = A;

A = A->berikut;A = A->berikut;

delete hapus;delete hapus;

1A 2 ?

1

A

2 ?

hapus

1

2

1

2

3

3

Menghapus elemen terakhir (1)Menghapus elemen terakhir (1)

Asumsi :Asumsi : Node *hapus = new Node;Node *hapus = new Node;

hapus = A->berikut; hapus = A->berikut;

1A 2 ?

1A 2 ?

hapus

1

1

Menghapus elemen terakhir (2)Menghapus elemen terakhir (2)

Asumsi :Asumsi : Node *hapus = new Node;Node *hapus = new Node;

hapus = A->berikut; hapus = A->berikut;

delete hapus;delete hapus;1A 2 ?

1A 2 ?

hapus

1

1

2

2

Menghapus elemen terakhir (3)Menghapus elemen terakhir (3)

Asumsi :Asumsi : Node *hapus = new Node;Node *hapus = new Node;

hapus = A->berikut; hapus = A->berikut;

delete hapus;delete hapus;

A->berikut = 0; A->berikut = 0; 1A 2 ?

1 0A 2 ?

hapus

1

1

2

2

3

3

Buatlah algoritma untuk menyalin Buatlah algoritma untuk menyalin seluruh elemen sebuah link list.seluruh elemen sebuah link list.

Buatlah algoritma untuk menyalin Buatlah algoritma untuk menyalin seluruh elemen sebuah link list yang seluruh elemen sebuah link list yang genap.genap.

Buatlah algoritma untuk menghapus Buatlah algoritma untuk menghapus seluruh elemen sebuah link list yang seluruh elemen sebuah link list yang genap.genap.