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.
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 berarti “jumlahkan 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