Ix struktur pointer

14
Struktur Pointer 109 IX POINTER IX.1 Pendahuluan - Pointer adalah suatu variabel yang menyimpan alamat dari suatu data, dan bukan menyimpan datanya sendiri. - 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. 1000 ? zzzz 1000 alamat x px menunjuk ke variabel x Gambar 9.1 Variabel pointer px menunjuk ke variabel x. IX.2 Pendeklarasian Variabel Pointer - Variabel tipe pointer dideklarasikan dengan bentuk sebagai berikut: type *nama_variabel; - 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. char *pch1, *pch2; tanda akhir pernyataan deklarasi menyatakan variabel pointer nama variabel pointer tipe data yang ditunjuk oleh variabel pointer Gambar 9.2 Ilustrasi pendeklarasian variabel pointer.

Transcript of Ix struktur pointer

Page 1: Ix struktur pointer

Struktur Pointer 109

IX POINTER IX.1 Pendahuluan

- Pointer adalah suatu variabel yang menyimpan alamat dari suatu data, dan bukan menyimpan datanya sendiri.

- 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.

1000

?

zzzz

1000

alamat

x

px menunjukke variabel x

Gambar 9.1 Variabel pointer px menunjuk ke variabel x. IX.2 Pendeklarasian Variabel Pointer

- Variabel tipe pointer dideklarasikan dengan bentuk sebagai berikut:

type *nama_variabel;

- 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.

char *pch1, *pch2;tanda akhirpernyataan deklarasi

menyatakanvariabel pointer

nama variabelpointertipe data yang

ditunjuk olehvariabel pointer

Gambar 9.2 Ilustrasi pendeklarasian variabel pointer.

Page 2: Ix struktur pointer

Struktur Pointer 110

IX.3 Mengatur Pointer Agar Menunjuk ke Variabel Lain

- Agar suatu pointer menunjuk ke variabel yang lin, 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”. - 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.

IX.4 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. - Contoh program berikut memperlihatkan pemakaian variabel

pointer.

Page 3: Ix struktur pointer

Struktur Pointer 111

/* --------------------------------- */ /* 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); } Contoh eksekusi: C> Pointer Alamat x = 5B87:2230 Isi px = 5B87:2230 Isi x = 87 Nilai yang ditunjuk px = 87 Nilai y = 87 Program 9-1.

- Pada program di atas, dua pernyataan px = &x; y = *px;

- sebenarnya dapat digantikan dengan sebuah pernyataan y = x;

Page 4: Ix struktur pointer

Struktur Pointer 112

IX.5 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 brtipe int.

IX.6 Mengubah Isi Suatu Variabel Melalui Pointer

- Contoh berikut memberikan gambaran tentang pengubahan isis suatu variabel secara tak langsung (yaitu 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 brarti “jumlahkan isi variabel yang ditunjuk oleh

pd dengan 10 dan simpan hasilnya ke variabel tersebut”, atau identik dengan pernyataan:

D = d + 10;

- Namun seandainya tidak ada instruksi

Pd = &d;

- maka pernyataan:

*pd = *pd + 10;

Page 5: Ix struktur pointer

Struktur Pointer 113

- tidak akan sama dengan

d = d + 10; /* ---------------------------------- */ /* 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); } Contoh hasil eksekusi: C> Pointer2 Isi d semula = 54.6 Isi d kini = 64.6 Program 9-2 IX.7 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:

static int tgl_lahir[3] = { 01, 09, 64 };

- dan

int *ptgl;

Page 6: Ix struktur pointer

Struktur Pointer 114

- 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.

/* ------------------------------------------- */ /* 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]); } Contoh hasil eksekusi: C>Pointer3 Nilai yang ditunjuk oleh ptgl = 24 Nilai dari tgl_lahir[0] = 24 Program 9-3

Page 7: Ix struktur pointer

Struktur Pointer 115

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

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

- Jika diimplementasikan dengan menggunakan pointer

tgl_lahir[i]

- dapat digantikan menjadi

*(ptgl + i)

- dengan terlebih dahulu mengatur ptgl agar menunjuk ke array

tgl_lahir, sehingga penulisan instruksi penampilan isi array tgl_lahir dapat diubah menjadi:

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

- 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. - Jadi

*(pa + 0) identik dengan a[0] *(pa + 1) identik dengan a[1] *(pa + 2) identik dengan a[2]

- Ungkapan seperti

pa + i

- memiliki arti “tambahkan nilai pa (berisi alamat) dengan i kali

ukuran dari obyek yang ditunjuk oleh pa”. - Jika pa dideklarasikan sebagai

int *pa;

Page 8: Ix struktur pointer

Struktur Pointer 116

- maka obyek dari pa adalah data int (berukuran 2 byte). - Cara lain dalam menampilkan isi suatu array yaitu dengan

menaikkan isi variabel pointer dengan menggunakan operator ++.

*(ptgl + i) - dapat diganti menjadi ptgl++

- Misalkan suatu instruksi:

int *pa; int a[3];

- Sesudah pernyataan: pa = a;

pa

array a

0 1 2 indeks

- Sesudah pernyataan: pa++;

pa

array a

0 1 2 indeks

IX.8 Array Dari Pointer

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

char *namahari[10];

Page 9: Ix struktur pointer

Struktur Pointer 117

- merupakan pernyataan untuk mendeklarasikan array pointer. - Array namahari terdiri dari 10 elemen berupa pointer yang

menunjuk ke data bertipe char.

IX.9 Inisialisasi Array

- Array pointer dapcontoh:

Static char * { “Senin “Selas “Rabu “Kam “Jum’ “Sabtu “Ming };

- Pada contoh di at

namahari[0namahari[1namahari[2dan seterusn

Gambar 9.3 Array Pointer.

?

?

?

?

xxxx

namahari

Pointer

at diinisialisasi sewaktu pendeklarasian. Sebagai

namahari[ ] = ”, a”, ”, is”, at”, ” , gu”

as,

] menunjuk ke string “Senin” ] menunjuk ke string “Selasa” ] menunjuk ke string “Rabu” ya.

Page 10: Ix struktur pointer

Struktur Pointer 118

454

xxxx

namahari

418

424

431

436

442

448

454

418

424

448

442

436431

S E N I N \0

S E L A S A \0

R A B U \0

K A M I S \0

J U M A T \0

S A B T U \0

M I N G G U \0

Gambar 9.4 Array pointer yang menunjuk data string. IX.10 Pointer Menunjuk Pointer

- Suatu pointer bisa saja menunjuk ke pointer lain. Gambar 9.5 memperlihatkan contoh mengenai hal ini.

Variabelvar_x

Pointerptr2

alamatptr1

alamatvar_x nilai

Pointerptr1

Gambar 9.5 Pointer yang menunjuk ke pointer.

- Untuk membentuk rantai pointer seperti pada gambar di atas, diperlukan pendeklarasian sebagai berikut:

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

- Perhatikan bahwa pada deklarasi di depan:

o var_x adalah variabel bertipe int. o ptr1 adalah variabel pointer yang menunjuk ke data bertipe

int.

Page 11: Ix struktur pointer

Struktur Pointer 119

o ptr2 adalah variabel pointer yang menunjuk ke pointer int (itulah sebabnya deklarasinya berupa : int **ptr2;)

- Agar ptr1 menunjuk ke variabel var_x, perintah yang diperlukan berupa

ptr1 = &var_x;

- Sedangkan supaya ptr2 menunjuk ke ptr1, instruksi yang

diperlukan adalah:

ptr2 = &ptr1;

- Contoh program berikut memberikan gambaran cara pengaksesan nilai pada var_x melalui pointer ptr1 dan ptr2.

/* ------------------------------------------- */ /* 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); } Contoh hasil eksekusi: C>Ptrptr Nilai var_x = 234 Nilai var_x = 234 Program 9-4

Page 12: Ix struktur pointer

Struktur Pointer 120

IX.11 Pointer dan Fungsi

- Variabel pointer dapat digunakan sebagai parameter dalam suatu fungsi.

- Dalam kaitan ini pointer dapat sebagai: o Parameter fungsi o Keluaran fungsi

IX.11.1 Pointer Sebagai Parameter Fungsi

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

- Misal pada fungsi berikut:

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

- Fungsi di atas dimaksudkan agar jika dipanggil, variabel yang

berkaitan dengan parameter aktual dapat diubah nilainya, yaitu masing-masing dinaikkan sebesar 2.

- Contoh pemanggilan fungsinya adalah

naikkan_nilai(&a, &b);

- Perhatikan bahwa dalam hal ini variabel a dan b harus ditulis diawali dengan operator alamat (&) yang berarti menyatakan alamat variabel, sebab parameter fungsi dalam pendefinisian berupa pointer.

Program 9-5 IX.11.2 Pointer Sebagai Keluaran Fungsi

- Suatu fungsi dapat dibuat agar keluarannya berupa pointer. - Misalnya, suatu fungsi menghasilkan keluaran berupa pointer yang

menunjuk ke string nama bulan, seperti pada contoh berikut.

Page 13: Ix struktur pointer

Struktur Pointer 121

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] ); }

- Pada definisi fungsi di atas,

char *nama_bulan

- menyatakan bahwa keluaran fungsi nama_bulan( ) berupa pointer yang menunjuk ke obyek bertipe char (atau string).

- Dalam fungsi nama_bulan( ), mula-mula array bernama bulan dideklarasikan dan sekaligus diinisialisasi agar menunjuk ke sejumlah string yang menyatakan nama bulan.

- Di bagian akhir fungsi, pernyataan

return( (n<1 || n>12) ? bulan[0] : bulan[n] );

- menyatakan bahwa hasil fungsi berupa pointer yang menunjuk ke: o string “Kode ulan salah” (bulan[0]) jika masukan fungsi (n<1

atau n>12) o bulan[n] untuk n yang terletak antara 1 sampai 12

- Contoh program berikut akan memperjelas keterangan di atas. /* ----------------------------------------------- */ /* File program : Ptrbulan.c */ /* Contoh fungsi dengan keluaran berupa */ /* pointer yang menunjuk string */ /* ----------------------------------------------- */

Page 14: Ix struktur pointer

Struktur Pointer 122

#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]); } Contoh hasil eksekusi : C>Ptrbulan Bulan (1 .. 12) : 14 Kode bulan salah C>Ptrbulan Bulan(1 .. 12) : 3 Maret Program 9-6