Minggu ke-10 Pointer Pendahuluan Memahami konsep pointer yang merupakan variabel yang dapat memegang alamat dari suatu objek dalam memory. Pointer digunakan dalam program untuk melalukan akses dan manipulasi alamat memory. Dalam C, array dan pointer memiliki keterkaitan konsep yang erat. Array biasa dikenal sebagai pointer yang tetap (fixed pointer) sedangkan pointer tidaklah tetap, artinya alamat memori yang dipegangnya dapat diubah-ubah. Jika pada bahasa pemrograman yang lain disediakan “pemanggilan melalui alamat (call by reference)”, dalam C, pointer digunakan sebagai parameter dalam pendefinisian fungsi (function) untuk melalukan efek pemanggilan melalui alamat tersebut.
Objektif
Memperkenalkan cara pendeklarasian pointer Menjelaskan penggunaan pointer Menjelaskan konsep dereferensing (menbaca / memberikan nilai yang ditunjuk oleh sebuah pointer) Menjelaskan penggunaan indeks (subscript) pada pointer.
Bahan Bacaan Buku pegangan atau buku-buku lain yang menjelaskan tentang topik ini.
Copyright © 2010, Dr. Taufik Fuadi Abidin, S.Si M.Tech dan Irvanizam M.Sc, Program Studi Informatika FMIPA Universitas Syiah Kuala
1
Pendeklarasian Menggunakan Simbol * Definisi Variabel dalam program yang dideklarasikan untuk memegang dan mengakses nilai suatu alamat dalam memori dikenal dengan sebutan pointer. Jika p adalah suatu variable maka &p merupakan lokasi atau alamat dalam memori dimana nilai yang dipegang oleh p disimpan. Pendeklarasian Dalam C, pada saat kita mendeklarasi sebuah pointer, simbol asterisk ' * ' selalu digunakan setelah tipe data dan sebelum nama pointer. Sebagai contoh: int * pi;
bentuk umum: tipe_data * nama_pointer;
Simbol asterik ' * ' memberitahukan kompiler bahwa yang ingin dideklarasi adalah sebuah pointer yang menyimpan alamat memori bertipe int. Pendeklarasian seperti contoh di atas hanya memberitahukan kompiler bahwa pi adalah pointer ke int tanpa memberikan nilai awal apapun. Sebuah pointer bila dideklarasikan dan tidak diberi nilai awal akan secara otomatis diberi nilai NULL. Pengujian dapat dilakukan sebagai berikut: if (pi == NULL) { … }
Copyright © 2010, Dr. Taufik Fuadi Abidin, S.Si M.Tech dan Irvanizam M.Sc, Program Studi Informatika FMIPA Universitas Syiah Kuala
2
Visualisasi Pointer Visualisasi Pointer Bila dalam program diterdapat pernyataan: int i = 2; int *pi = &i; maka visualisasi dari kedua pernyataan di atas lebih kurang sebagai berikut:
i=
2
pi Artinya terdapat sebuah variabel i bertipe integer dengan nilai 2 dan pi adalah sebuah pointer yang memegang / menunjuk ke alokasi memori bertipe int yang dimiliki oleh i. Pernyataan: int *pi = &i; artinya mendeklarasi sebuah pointer pi bertipe int dengan nilai awal berupa alamat dari i yang bertipe int. Simbol & pada pernyataan di atas merupakan operator unari yang bermakna alamat (address). Pada pernyataan di atas, nilai awal dari pi adalah alamat dari i.
Copyright © 2010, Dr. Taufik Fuadi Abidin, S.Si M.Tech dan Irvanizam M.Sc, Program Studi Informatika FMIPA Universitas Syiah Kuala
3
Operator Dereferensing Operator Dereferensing Operator dereferensing bermakna pembacaan / pemberian nilai data pada alamat yang dipegang oleh sebuah pointer. Operator deferensing juga menggunakan simbol asterik ' * ' tetapi berbeda maknanya dengan simbol asterik pada saat pendeklarasian pointer. Perhatikan pernyataan berikut: int i = 2; int *pi; pi = &i; *pi = 12; printf("%d\n", i); Hasil keluaran dari program di atas adalah 12 atau dapat dikatakan bahwa variabel i yang pada awalnya bernilai 2 berubah akibat pernyataan *pi = 12. Ini berarti bahwa operator dereferensing mengubah nilai dari suatu memori yang ditunjuk oleh pointer tersebut. Pada contoh di atas pi menunjuk ke alamat i, dan dereferensing *pi = 12 mengakibatkan nilai dari i yang ditunjuk oleh pi berubah menjadi 12.
Copyright © 2010, Dr. Taufik Fuadi Abidin, S.Si M.Tech dan Irvanizam M.Sc, Program Studi Informatika FMIPA Universitas Syiah Kuala
4
Operator Dereferensing (Lanjutan) Contoh Penggunaan Operator Dereferensing int i = 2; int j = 3; int *pi; int *pj; pi = &i; pj = pi; *pj = 20; printf("%d\n", i); pj = &j; pi = pj; *pi = 30; printf("%d\n", j);
Keluaran dari potongan program tersebut secara berurut adalah: 20 30
Terlihat bahwa nilai i yang pada awalnya bernilai 2 berubah menjadi 20 akibat dari dereferensing pointer pj atau *pj = 20; sedangkan nilai dari j yang pada awalnya bernilai 3 berubah menjadi 30 akibat dari dereferensing pointer pi atau *pi = 30;
Copyright © 2010, Dr. Taufik Fuadi Abidin, S.Si M.Tech dan Irvanizam M.Sc, Program Studi Informatika FMIPA Universitas Syiah Kuala
5
Operator Dereferensing (Lanjutan) Visualisasi langkah demi langkah dari contoh program sebelumnya adalah sebagai berikut: int i = 2; int j = 3; int *pi; int *pj;
i=
j=
2
pi
3 pj
NULL
NULL
Selanjutnya, pernyataan: pi = &i; pj = pi; mengakibatkan pi menampung alamat dari i dan pj sama dengan pi. Ilustrasinya:
i=
2
pi
j=
3
pj
Copyright © 2010, Dr. Taufik Fuadi Abidin, S.Si M.Tech dan Irvanizam M.Sc, Program Studi Informatika FMIPA Universitas Syiah Kuala
6
Operator Dereferensing (Lanjutan) Pernyataan: *pj = 20; printf("%d\n", i); mengakibatkan nilai dalam memori yang ditunjuk oleh pointer pj dalam hal ini adalah nilai dari i berubah menjadi 20. 20 3 i= j=
pi
pj
Kemudian pernyataan: pj = &j; pi = pj; mengakibatkan arah dari pointer pj berubah menjadi menunjuk ke alamat dari variabel j yang juga bertipe int. Selanjutnya, pointer pi menampung juga nilai dari alamat j yang sebelumnya telah ditunjuk oleh pointer pj.
i=
20
j=
pi
Copyright © 2010, Dr. Taufik Fuadi Abidin, S.Si M.Tech dan Irvanizam M.Sc, Program Studi Informatika FMIPA Universitas Syiah Kuala
3
pj
7
Operator Dereferensing (Lanjutan) Dan yang terakhir pernyataan: *pi = 30; printf("%d\n", j); mengakibatkan nilai dari variabel yang ditunjuk oleh pi berubah menjadi 30 akibat adanya operator dereferensing *pi = 30, atau secara visual adalah: i=
20
pi
j=
30
pj
Kesimpulan: Dengan menggunakan pointer dan operator derefensing nilai dari suatu variabel dalam memori dapat dengan sangat mudah dimanipulasi. Hal inilah yang membuat pointer menjadi “power” dalam pemrograman sekaligus sebagai “the most possibility of bugs” atau kemungkinan terbesar penyebab kesalahan dalam program. Oleh karena itu, pointer harus dioperasikan secara benar.
Copyright © 2010, Dr. Taufik Fuadi Abidin, S.Si M.Tech dan Irvanizam M.Sc, Program Studi Informatika FMIPA Universitas Syiah Kuala
8
Pointer Vs Array Bila sebuah array dideklarasikan sebagai berikut: int a[6] = {8, 4, 6, 3, 4, 10}; 2310 8 a
2318 4 2314
6
2326 3 2322
4
10 2330
alamat
Kita sudah mengetahui bahwa operator [ ] dapat digunakan pada array. Untuk membaca data pada indeks ke 2, dapat dilakukan dengan menulis a[2]. Karena a juga merupakan pointer maka operator dereferensing pun dapat diaplikasikan pada a. a[2] equivalen bila ditulis *(a +2) Bukti: *(a+2)
= = = = =
*(a + sizeof(a) * 2) *(a + 4 * 2) *(2310 + 8) *(2318) 6
a[2] = 6
Copyright © 2010, Dr. Taufik Fuadi Abidin, S.Si M.Tech dan Irvanizam M.Sc, Program Studi Informatika FMIPA Universitas Syiah Kuala
9
Pointer dan String String C tidak menyediakan tipe data primitif berupa string. String dalam pemrograman C direpresentasikan dengan menggunakan pointer bertipe char. Perhatikan deklarasi berikut: char * str = "Pemrograman C" Mari kita diskusikan kasus berikut ini: #include <stdlib.h> #include <stdio.h> #include <string.h> int main(void) { char ch[80], *pch = &ch[0]; strcpy(ch, "diploma 3 ikmi"); putchar(*pch++); putchar((*pch)++); putchar(*++pch); putchar(*++pch); putchar(++*pch); putchar(++(*pch)); putchar(++(*pch++));
++pch; putchar(++(*++pch)); putchar('\n'); printf("%s\n",ch); return (EXIT_SUCCESS); }
Apakah hasilnya?
Copyright © 2010, Dr. Taufik Fuadi Abidin, S.Si M.Tech dan Irvanizam M.Sc, Program Studi Informatika FMIPA Universitas Syiah Kuala
10