Dalam pemrograman C, definisi array dituliskan:
type_name array_name[number_of_array]
misal array A bertipe integer dengan 10 anggota didefinisikan dengan:
int A[10];
Apa maksudnya?
Dengan penulisan diatas, maka kita memrintahkan kompiler untuk menyediakan alamat memori sebesar 10 * sizeof(int). Bila ukuran int adalah 4 byte, maka compiler akan mengalokasikan sebesar 10 * 4 byte = 40 byte memori untuk A.
Bagaimana penggambaran di memori:
misalnya alamat awal Array A (A[0]) adalah 0xFFFF0000, maka dapat digambarkan:
A[0] | 0xFFFF0000 |
A[1] | 0xFFFF0004 |
A[2] | 0xFFFF0008 |
….. | …...................... |
A[7] | 0xFFFF001C |
A[8] | 0xFFFF0020 |
A[9] | 0xFFFF0024 |
Lalu apa hubungannya dengan pointer?
Seperti pada pembahasan pointer dengan variabel, pointer pada array sesungguhnya kita juga memerintahkan pointer agar menunjuk ke alamat yang telah dialokasikan oleh array tersebut. Pada contoh diatas, bila kita mendefinisikan suatu pointer
int *P:
kemudian kita tunjuk ke alamat Array A
P = &A[0];
maka alamat P akan menunjuk ke alamat 0xFFFF0000
Untuk lebih jelasnya coba program berikut ini:
int main()
{
int *pointer, Array[10];
int i;
for(i=0;i<10;i++)>
Array[i] = i; //pengisian array
for(i=0;i<10;i++)
printf(“Array = %d\n”,Array[i]); //cetak Array
pointer = &Array[0]; // tunjuk pointer ke alamat awal array
// bisa dituliskan pointer=Array
for(i=0;i<10;i++)
printf(“pointer = %d\n”,*pointer++); //cetak pointer
}
Bagaimana hasil program diatas?
Hasil dari:
for(i=0;i<10;i++)
printf(“Array = %d\n”,Array[i]); //cetak Array
dengan:
for(i=0;i<10;i++)
printf(“pointer = %d\n”,*pointer++); //cetak pointer
adalah sama.
Hal ini berarti dapat kita simpulkan bahwa:
1. Kita dapat membaca isi dari suatu array melalui suatu pointer, asalkan pointer tersebut menunjuk ke alamat dari array yang ingin kita baca.
2 Increment dari pointer yang menunjuk ke array adalah sam dengan increment index (posisi) dari array yang ditunjuk.
Bagaimana dengan mengisikan data ke array dengan pointer?
Sama halnya dengan contoh diatas. Lihat contoh berikut ini;
int main()
{
int *pointer, Array[10];
int i;
pointer = &Array[0]; // tunjuk pointer ke alamat awal array
// bisa dituliskan pointer=Array
for(i=0;i<10;i++)
printf(“pointer = %d\n”,*pointer++); //cetak pointer
for(i=0;i<10;i++)
printf(“Array = %d\n”,Array[i]); //cetak Array
}
Hasilnya sama bukan?
Namun hati-hati ada kalanya kita tanpa sadar mebuat bug yang menyebabkan segmentation fault, contohnya:
int main()
{
int *pointer, Array[10];
int i;
for(i=0;i<10;i++)
Array[i] = i; //pengisian array
pointer = &Array[0]; // tunjuk pointer ke alamat awal array
// bisa dituliskan pointer=Array
for(i=0;i<10;i++)
printf(“pointer = %d\n”,*pointer++); //cetak pointer
for(i=0;i<10;i++)>
*pointer++ = i+10; //pengisian array melalui pointer
for(i=0;i<10;i++)
printf(“Array = %d\n”,Array[i]); //cetak Array
}
Bila kita lihat sekilas, tidak ada kesalahan dalam program diatas, namun saat kita eksekusi akan timbul segmentation fault. Penyebabnya adalah:
for(i=0;i<10;i++)>
*pointer++ = i+10; //pengisian array melalui pointer
Pada instruksi diatas posisi *pointer sudah tidak lagi menunjuk ke Array[0], namun sudah menunjuk ke Array[9 + 1], karena proses increment alamat pointer pada instruksi sebelumnya:
for(i=0;i<10;i++)
printf(“pointer = %d\n”,*pointer++); //cetak pointer
Dan kita telah memesan alamat memori sebesar 10 block (40 byte), sedangkan *pointer menunjuk ke block ke 11 (Array[9+1]). Jadi block ke 11 (Array[9+1]) belum dialokasikan, akibatnya muncul segmentation fault.
Bagaimana mengatasinya?
Menambah index Array? Solusi ini mungkin bisa berjalan namun tidak efisien. Solusi yang baik adalah dengan mengarahkan kembali penunjukan pointer ke alamat awal Array:
pointer = &Array[0]; // Tunjuk pointer ke alamat awal array
// bisa dituliskan pointer=Array
for(i=0;i<10;i++)>
*pointer++ = i+10; //pengisian array melalui pointer
pointer = &Array[0]; // tunjuk pointer ke alamat awal array
// bisa dituliskan pointer=Array
Coba ubah program diatas! Jalankan! Masih terjadi segmentation fault?
Maka yang perlu diingat adalah jangan lupa untuk mengembalikan pointer keposisi awal (posisi yang teralokasikan) sebelum kita menggunakan lagi.
Lalu apa perbedaan Array dan Pointer?
Array telah teralokasikan alamatnya pada memori pada tiap-tiap indexnya, sedangkan pointer hanyalah suatu penunjuk ke alamat memori (context Array).
Bisakah pointer menggantikan Array tanpa ada Array?
Bisa, asalkan pointer kita tunjuk ke alamat yang sudah teralokasikan oleh compiler. Caranya? Lihat pada bagian “POINTER dan ALOKASI MEMORI DINAMIS”
Wah jelas banget, sangat bermanfaat sekali gan, jadi mulai ngerti perbedaan penggunaan array dan pointer.. thanks
BalasHapusmantap min penjelasannya
BalasHapus