POINTER dan ARRAY

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”

2 komentar:

  1. Wah jelas banget, sangat bermanfaat sekali gan, jadi mulai ngerti perbedaan penggunaan array dan pointer.. thanks

    BalasHapus