Pointer
Pointer merupakan variabel yang dapat memegang alamat dari suatu objek dalam memori. Pointer digunakan dalam program untuk mengakses dan manipulasi data pada alamat tertentu. Dalam ANSI/C, array dan pointer memiliki keterkaitan yang erat. Array dikenal sebagai pointer yang tetap (fixed pointer) sedangkan pointer sangat dinamis, artinya alamat yang dipegang oleh sebuah pointer dapat berubah-ubah. Jika dalam materi fungsi dikenal mekanisme pengiriman suatu parameter via alamat atau (called-by reference), dalam ANSI/C, pengiriman parameter seperti itu dapat dilakukan menggunakan pointer.
Objektif
Memperkenalkan cara mendeklarasi pointer Menjelaskan cara menggunakan pointer dalam program Menjelaskan konsep dereferensing (menbaca dan memberi nilai yang ditunjuk oleh sebuah pointer) Menjelaskan cara mengakses indeks (subscript) pada array menggunakan pointer
Bahan Bacaan Buku pegangan atau bahan-bahan lain yang menjelaskan tentang pointer dalam bahasa pemrograman C.
Taufik Fuadi Abidin - Irvanizam, Jurusan Informatika, FMIPA Universitas Syiah Kuala – http://www.informatika.unsyiah.ac.id
1
Definisi dan Deklarasi Pointer Definisi Pointer adalah sebuah variabel dengan tipe tertentu yang dapat digunakan untuk mencatat alamat dari suatu variabel yang setipe dengannya, mengakses dan memanipulasi data yang tersimpan dalam alamat tersebut. Jika int x adalah sebuah variable bertipe integer maka &x berarti alamat dari x. Jika p adalah sebuah pointer bertipe integer maka p dapat menyimpan dan memegang alamat dari x tersebut.
Deklarasi Pointer Dalam ANSI/C, simbol asterisk * digunakan untuk mendeklarasi sebuah pointer. Bentuk umum pendeklarasian pointer adalah: tipe_data *nama_pointer; Sebagai contoh:
int *p;
Simbol asterik * memberitahu compiler bahwa sebuah pointer bertipe int dideklarasikan. Pendeklarasian seperti contoh di atas hanya memberitahukan compiler bahwa p adalah pointer bertipe int tanpa memberikan nilai awal apapun kepada p. Jika sebuah pointer tidak diberi nilai awal secara eksplisit oleh programmer, maka compiler secara otomatis memberi nilai NULL sebagai nilai awal kepada pointer tersebut. Salah satu cara menguji apakah sebuah pointer bernilai NULL adalah: if(p == NULL){ : } Taufik Fuadi Abidin - Irvanizam, Jurusan Informatika, FMIPA Universitas Syiah Kuala – http://www.informatika.unsyiah.ac.id
2
Visualisasi Pointer Perhatikan pernyataan di bawah ini: int i = 2; int *pi = &i; Pernyataan di atas dapat divisualisasi sebagai berikut:
i=
2
pi
Atau dengan kata lain, sebuah variabel i bertipe int dengan nilai awal 2 dideklarasikan dan sebuah pointer pi bertipe int dideklarasikan dengan nilai awal dari pointer pi tersebut adalah alamat dari variabel i. Pernyataan: int *pi = &i; Berarti 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).
Taufik Fuadi Abidin - Irvanizam, Jurusan Informatika, FMIPA Universitas Syiah Kuala – http://www.informatika.unsyiah.ac.id
3
Operator Dereferencing Operator dereferencing bermakna pembacaan dan pemberian nilai pada alamat yang dipegang oleh sebuah pointer. Operator deferencing juga menggunakan simbol asterik * tetapi berbeda maknanya dengan simbol asterik yang digunakan pada saat sebuah pointer dideklarasikan. Perhatikan pernyataan berikut: int int
i = 2; *pi;
pi = &i; *pi = 12; printf("%d\n", i); Hasil keluaran dari program di atas adalah 12. Hal ini terjadi karena i yang pada awalnya bernilai 2 berubah nilainya akibat dari pernyataan *pi = 12. Simbol asterik pada pernyataan adalah operator dereferencing yang mengubah nilai dari suatu memori yang ditunjuk oleh pointer pi. Pada contoh di atas pi memegang (tunjuk ke) alamat i. Pernyataan dereferencing *pi = 12 mengakibatkan nilai i berubah menjadi 12.
Taufik Fuadi Abidin - Irvanizam, Jurusan Informatika, FMIPA Universitas Syiah Kuala – http://www.informatika.unsyiah.ac.id
4
Operator Dereferencing (Lanjutan) Contoh: int int int int
i = 2; j = 3; *pi; *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 dan 30
Terlihat bahwa variabel i yang pada awalnya bernilai 2 berubah menjadi 20 akibat dari dereferencing pointer pj atau *pj = 20; sedangkan nilai dari j yang pada awalnya bernilai 3 berubah menjadi 30 akibat dari dereferencing pointer pi atau *pi = 30;
Taufik Fuadi Abidin - Irvanizam, Jurusan Informatika, FMIPA Universitas Syiah Kuala – http://www.informatika.unsyiah.ac.id
5
Operator Dereferencing (Lanjutan) Visualisasi langkah demi langkah dari contoh program sebelumnya adalah sebagai berikut: int int int int
i = 2; j = 3; *pi; *pj;
i=
j=
2
pi
3 pj
NULL
NULL
Selanjutnya, pernyataan: pi pj
= &i; = pi;
mengakibatkan pi menampung alamat dari i dan pj sama dengan pi. Ilustrasinya:
i=
2
pi
j=
3
pj
Taufik Fuadi Abidin - Irvanizam, Jurusan Informatika, FMIPA Universitas Syiah Kuala – http://www.informatika.unsyiah.ac.id
6
Operator Dereferencing (Lanjutan) Pernyataan: *pj = 20; printf("%d\n", i); mengakibatkan nilai dalam memori yang ditunjuk oleh pointer pj dalam hal ini adalah i berubah menjadi 20.
i=
20
pi
j=
3
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
pi
Taufik Fuadi Abidin - Irvanizam, Jurusan Informatika, FMIPA Universitas Syiah Kuala – http://www.informatika.unsyiah.ac.id
j=
3
pj
7
Operator Dereferencing (Lanjutan) Pernyataan: *pi = 30; printf("%d\n", j); mengakibatkan nilai dari variabel yang ditunjuk oleh pi berubah menjadi 30 akibat adanya pernyataan dereferencing *pi = 30, atau bila divisualisasi sebagai berikut: i=
20
pi
j=
30
pj
Kesimpulan Dengan menggunakan pointer dan operator dereferencing, nilai dari suatu variabel dalam memori dapat dengan mudah dimanipulasi. Hal ini membuat pointer menjadi sangat powerful dalam pemrograman ANSI/C, terutama dalam pengiriman variabel-variabel dengan memori besar via parameter fungsi (akan dibahas pada pertemuan ke-12). Namun, kecerobohan dalam menggunakan pointer juga dapat mengakibatkan bugs atau error. Oleh karena itu, penggunaan pointer dalam pemrograman harus dilakukan secara benar dan hati-hati.
Taufik Fuadi Abidin - Irvanizam, Jurusan Informatika, FMIPA Universitas Syiah Kuala – http://www.informatika.unsyiah.ac.id
8
Pointer versus 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
Pada pertemuan sebelumnya, telah dibahas penggunaan operator [] pada array. Operator [] dapat digunakan untuk membaca data pada indeks tertentu, misalnya indeks ke 2 dalam array dengan menulis a[2]. Karena a adalah sebuah array dan juga merupakan sebuah pointer maka operator dereferencing pun dapat diaplikasikan pada a.
Ilustrasi Sederhana *(a+2)
= = = = =
*(a + sizeof(a) * 2) *(a + 4 * 2) *(2310 + 8) *(2318) 6
a[2] = 6
Taufik Fuadi Abidin - Irvanizam, Jurusan Informatika, FMIPA Universitas Syiah Kuala – http://www.informatika.unsyiah.ac.id
9
Pointer dan String String Bahasa pemrograman ANSI/C tidak menyediakan tipe data string. String dalam pemrograman ANSI/C direpresentasikan menggunakan pointer bertipe char. Perhatikan deklarasi berikut:
char *str =
"Pemrograman C";
Contoh: #include <stdlib.h> #include <stdio.h> #include <string.h>
++pch; putchar(++(*++pch)); putchar('\n'); printf("%s\n",ch);
int main(void){ char ch[80], *pch = &ch[0]; strcpy(ch, "informatika"); putchar(*pch++); putchar((*pch)++); putchar(*++pch); putchar(*++pch); putchar(++*pch); putchar(++(*pch)); putchar(++(*pch++));
return EXIT_SUCCESS; }
Apakah hasilnya?
Taufik Fuadi Abidin - Irvanizam, Jurusan Informatika, FMIPA Universitas Syiah Kuala – http://www.informatika.unsyiah.ac.id
10