Sabtu, 08 April 2017

POINTER 2

Algoritma Dan Pemrograman 2
Pointer 2


Pointer Dan Alokasi  Memori
Apabila kita ingin memfungsikan pointer sebagaimana suatu ARRAY maka kita harus mengalokasikan memori sesuai ukuran yang kita ingini. Inilah kelebihannya, kita mampu mengalokasikan memori sesuai kebutuhan kita.

Contoh kasus:
Kita ingin mengambil data pixel suatu gambar, kemudian kita menyimpannya ke buffer (penampung sementara) untuk diolah. Bagaimana kita mendefinisikan ukuran array bila ukuran gambar bermacam-macam?
Perlu diingat jumlah array harus didefinisikan dahulu sebelum, dipakai !
Apabila ukuran array lebih kecil dari yang kita gunakan, maka akan menyebabkan segmentation fault (banjir).
Menggunakan Array yang super besar? Bagaimana jika yang kita load ternyata ukurannya kecil? Tentu memboroskan memori.
Mengatur ukuran gambar agar fix? Tentu program kita menjadi tidak portable! Serta perlu editor gambar.

Solusi:
Kita gunakan alokasi memori dinamis! Dinamis? Ya! Karena kita dapat mengalokasikan dimana saja, berapa saja serta dapat didealokasikan kapan saja agar dapat dipakai untuk yang lain.
Apa perbedaan memori dinamis dan statis (Array)?
Apa perbedaan memori dinamis dan statis (Array)?

Variabel statis adalah variabel yang dideklarasikan dan dinamai pada saat penulisan program. Memori yang dipakai oleh variabel ini akan tetap ada (dianggap terpakai) selama program dimana variabel tersebut dideklarasikan sedang dijalankan.

Variabel dinamis adalah variabel yang dibuat (dan mungkin juga dihapus/dirusak) selama eksekusi progam. Karena variabel dinamis belum nyata ada pada saat program dikompilasi (ia nyata-nyata ada pada saat dibuat yaitu pada saat program dieksekusi), maka variabel seperti ini tidak dapat dinamai pada saat program dibuat/ditulis.

Algorithma pemecahan masalah diatas:
a)Inisialisasi pointer
b)Load File Image
c)Dapatkan ukuran Image beserta pixelnya.
d)Alokasikan memori sebesar ukuran pada step 3, tunjuk pointer ke alamat memori yang dialokasikan ini.
e)Proses Image.
f)Apabila proses telah selesai dan alamat memori diatas sudah tidak dipakai, maka de-alokasikan alamat memori dari step 4. Agar bisa digunakan untuk yang lain.
g)Proses dealokasi penting dilakukan untuk meningkatkan performa, serta menghindari “out of memory”.
h)Cara mengalokasi memori salah satunya adalah menggunakan fungsi malloc seperti yang didefinisikan pada file stdlib.h:  (void *)malloc(size_of_memory_yang_dialokasikan)

Program :

#include <stdio.h>
#include <stdlib.h>
int main ()
{
int *X;
int *posAwal;
int i;
X=(int *)malloc(10*sizeof(int));//alokasi memory 10*4byte
//identik dengan X[10] pada array
posAwal=X;//simpan posisi awal X ke posAwal(agartidak tersesat)
printf ("Nama : Muhammad Tri Wiartanto\n");
printf ("/*dengan array*/\n");
for(i=0;i<10;i++)
X[i]=i;
for(i=0;i<10;i++)
printf ("X[%d]=%d\n",i,X[i]);
printf ("\n\n");
printf ("/*dengan pointer*/\n");
for(i=0;i<10;i++)
*X++=i*10;
X=posAwal;//kembalikan posisi awal X
for(i=0;i<10;i++)
printf("*X=%d\n",*X++);
free(X);//bebaskan memori X
}

Mengatur Pointer agar Menunjuk ke Variabel Lain
Agar suatu pointer menunjuk ke variabel lain, mula-mula pointer harus diisi dengan alamat dari variabel yang akan ditunjuk. Untuk menyatakan alamat dari suatu variabel, operator & (operator alamat, bersifat unary) bisa dipergunakan, dengan menempatkannya di depan nama variabel. Sebagai contoh, bila x dideklarasikan sebagai variabel bertipe int, maka
&x
berarti “alamat dari variabel x”. Adapun contoh pemberian alamat x 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.
Jika suatu variabel sudah ditunjuk oleh pointer, variabel yang ditunjuk oleh pointer tersebut dapat diakses melalui variabel itu sendiri (pengaksesan langsung) ataupun melalui pointer (pengaksesan tak langsung). Pengaksesan tak langsung dilakukan dengan menggunakan operator indirection (tak langsung) berupa simbol * (bersifat unary). Contoh penerapan operator * yaitu :
*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 sama dengan nilai x



Pada program di atas, dua pernyataan
px = &x; y = *px;
sebenarnya dapat digantikan dengan sebuah pernyataan berupa
y = x;
Seandainya pada program di atas tidak terdapat pernyataan
px = &x;
namun terdapat pernyataan
y = *px;

maka y tidaklah berisi nilai x, sebab px belum diatur agar menunjuk ke variabel x. Hal seperti ini harap diperhatikan. Kalau program melibatkan pointer, dan pointer belum diinisialisasi, ada kemungkinan akan terjadi masalah yang dinamakan “bug” yang bisa mengakibatkan komputer tidak dapat dikendalikan (hang). Selain itu tipe variabel pointer dan tipe data yang ditunjuk harus sejenis. Bila tidak sejenis maka akan terjadi hasil yang tidak diinginkan



Pada contoh di atas, saat penugasan
 pu = &u;
maka pu akan menunjuk data berukuran 4 byte (tipe float) sekalipun u berukuran 2 byte (tipe int). Oleh karena itu, pernyataan
nu = *pu;
 tidak akan membuat nu berisi nilai u. untuk lebih jelasnya lihat gambar berikut.

Pada contoh di atas, saat penugasan pu = &u; maka pu akan menunjuk data berukuran 4 byte (tipe float) sekalipun u berukuran 2 byte (tipe int). Oleh karena itu, pernyataan nu = *pu; tidak akan membuat nu berisi nilai u. untuk lebih jelasnya lihat gambar berikut.

Mengakses dan Mengubah isi Suatu Variabel Pointer

Contoh berikut memberikan gambaran tentang pengubahan isi 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
d = 54.5;
digunakan untuk mengisikan nilai 54,5 secara langsung ke variabel d. Adapun
pd = &d;
 digunakan untuk memberikan alamat dari d ke pd. Dengan demikian pd menunjuk ke variabel d. Sedangkan pernyataan berikutnya
*pd = *pd + 10; (atau: *pd += 10; )
merupakan instruksi untuk mengubah nilai variabel d secara tak langsung. Perintah di atas berartijumlahkan yang ditunjuk  pd dengan 10 kemudian berikan ke yang ditunjuk oleh  pd”, atau identik dengan pernyataan
d = d + 10;
 Akan tetapi, seandainya tidak ada instruksi
pd = &d;
maka pernyataan
*pd = *pd + 10;
tidaklah sama dengan
d = d + 10;


Pointer dan Array (pointer to array) 


Hubungan antara pointer dan array pada C sangatlah erat. Sebab sesungguhnya array secara internal akan diterjemahkan dalam bentuk pointer. Pembahasan berikut akan memberikan gambaran hubungan antara pointer dan array. Misalnya dideklarasikan di dalam suatu fungsi
static int tgl_lahir[3] = { 01, 09, 64 };
 int *ptgl;
Kemudian diberikan instruksi
ptgl = &tgl_lahir[0]; //pointer to array of integer
maka ptgl akan berisi alamat dari elemen array tgl_lahir yang berindeks nol. Instruksi di atas bisa juga ditulis menjadi
 ptgl = tgl_lahir;
sebab nama array tanpa tanda kurung menyatakan alamat awal dari array. Sesudah penugasan seperti di atas,
 *ptgl
 dengan sendirinya menyatakan elemen pertama (berindeks sama dengan nol) dari array tgl_lahir


Pointer dan String (pointer to string) 

Pada program di atas, char *pkota = “SEMARANG”; akan menyebabkan kompiler • mengalokasikan variabel pkota sebagai variabel pointer yang menunjuk ke obyek bertipe char dan menempatkan konstanta “SEMARANG” dalam suatu memori • kemudian pointer pkota akan menunjuk ke lokasi string “SEMARANG”
Pernyataan di atas menyerupai pernyataan char kota[] = “SEMARANG”; tetapi sebenarnya kedua pernyataan inisialisasi di depan tidaklah tepat sama. Sebab pkota adalah pointer (menyatakan alamat) yang dengan mudah dapat diatur agar menunjuk ke string lain (bukan string “SEMARANG”), sedangkan kota adalah array (array menyatakan alamat yang konstan, tak dapat diubah)






Tidak ada komentar:

Posting Komentar