21 Februari 2014

pointer atau value

Ketika dihadapkan dengan suatu  prosedur dengan signature semacam ini apa yang akan dilakukan?
void simpan_siswa(siswa* s);

Untuk bisa melakukan pemanggilan prosedur tersebut kita punya paling tidak dua kemungkinan kode yang dapat lolos kompilasi:
1. menggunakan address of value
void proses_siswa(...) {
  siswa sw;
  ...
  simpan_siswa(&sw);
}

2. menggunakan pointer
void proses_siswa(...) {
  siswa* sw_ptr;
  .../* ada malloc utk alokasi siswa */
  simpan_siswa(sw_ptr);
}

Sebelum menjelaskan mengapa kode mana yang benar, ada beberapa hal yang perlu diketahui tentang pointer, antara lain alokasi statikstack, alokasi dinamikheap,  scope, dan lifetime. Selain itu juga semantik/maksud/arti dari  siswa* s pada prosedur void simpan_siswa(siswa* s);

Variabel yang dialokasikan secara statik, seperti variable sw di kode 1, akan disimpan di stack dan mempunyai lifetime selama masih dalam scopenya (yaitu dalam prosedur proses_siswa). Jadi address yang ditunjuk oleh &sw adalah alamat di stack yang akan segera dihapus begitu keluar dari prosedur proses_siswa.

Variabel yang dialokasikan secara dinamik, seperti variable sw_ptr di kode 2, akan disimpan di heap dan mempunyai lifetime selama masih belum di-free, bahkan diluar scopenya (walau scopenya hanya dalam prosedur proses_siswa tapi lifetimenya masih berlaku diluar prosedur tadi).

Semantik  siswa* s pada prosedur void simpan_siswa(siswa* s); biasanya adalah entitas siswa yang berbeda-beda yang kemudian disimpan dalam suatu struktur (sebut saja list_siswa) yang dapat diakses dari seluruh sistem. (Bayangkan akan disimpan di suatu list yang tersimpan di memori, bukan dalam basisdata external). Jika menggunakan kode 1, maka jelas akan salah, karena siswa* akan menunjuk ke satu entitas saja dan nilainya akan hilang ketika keluar dari prosedur proses_siswa.

Simpulan:
Semantik deklarasi type* var biasanya dimaksudkan untuk menunjuk ke suatu entitas, sehingga pemanggilan yang tepat adalah dengan menunjukkan alamat di heap(seperti kode 2 yang dibuat dengan malloc).

Tidak ada komentar: