Fungsi Dalam Pemrograman
Artikel ini untuk seorang teman saya yang masih kurang paham dengan Fungsi dan Parameter. Seorang expert seharusnya tidak membuka artikel ini.
Dalam artikel ini saya akan merujuk Fungsi/Procedure dengan istilah Fungsi saja.
Memahami Fungsi secara jelas perlu pemahaman terhadap hal-hal yang berkaitan dengannya. Salah satunya adalah ruang lingkup variabel. Apa itu?
Variabel Memiliki Ruang Lingkup
Variabel adalah sebuah wadah untuk menyimpan nilai dengan mereferensikannya dengan sebuah nama yang didefinisikan. Dalam bahasa C int A = 2
berarti menciptakan variabel dengan nama A
yang bertipe Integer lalu ia mengandung nilai 2 didalamnya. Dengan menyebutkan A
secara tidak langsung merujuk pada nilai 2.
Pada faktanya, variabel memiliki “kawasan” yang bisa mengaksesnya, ini disebut Ruang Lingkup. Menciptakan sebuah variabel didalam fungsi X tidak menjadikan anda dapat mengakses variabel tersebut dari fungsi Y. Lihat contoh berikut.
#include <stdio.h>void tampilkanNilai()
{
printf(“%i \n”, A); // “berusaha” memanggil A dari `tampilkan`
}int main()
{
int A = 2; // mendeklarasikan A didalam fungsi `main` tampilkanNilai(); // memanggil fungsi `tampilkanNilai` return 0;
}
Dengan mengcompile source code diatas, didapat hasil error berikut:
/tmp/fungsi.c:5:21: error: ‘A’ undeclared (first use in this function)
printf(“%i \n”, A); // “berusaha” memanggil A
kata-kata error: ‘A’ undeclared mengimplikasikan bahwa variabel A
telah dipanggil di baris ke-5 (didalam fungsi tampilkanNilai
) namun variabel ini belum dideklarasikan. Artinya, A
yang dideklarasikan didalam fungsi main
tidak berlaku di kawasan fungsi tampilkanNilai
.
Peristiwa ini ada kaitan eratnya dengan konsep variabel lokal (local variable) yakni, sebuah variabel yang dideklarasikan didalam fungsi X hanya bisa diakses di fungsi itu saja, tempat dimana ia dideklarasikan.
Lalu bagaimana jika saya ingin mengirim A
yang ada di fungsi main
ke fungsi lain?
Parameter dalam Fungsi
Dalam konsep fungsi dikenal istilah argumen atau parameter. Dimana ia berguna sebagai cara untuk mengirim nilai ke fungsi yang dituju. Lihat contoh berikut.
#include <stdio.h>// `cetak` mempunyai parameter usia
void cetak(int usia)
{
printf(“Usia anda = %i \n”, usia); // memanggil variabel usia
}int main()
{
int umur = 60; // mendeklarasikan umur didalam fungsi `main` cetak(umur); // memanggil `cetak` dengan mengirim isi umur return 0;
}
Penjelasan:
- Saya mendeklarasikan variabel
umur
didalam fungsimain
. - Masih didalam
main
, saya memanggil fungsicetak
dengan mengirim isi konten variabelumur
ke fungsi tersebut. Sekali lagi, yang terkirim adalah isi konten bukan variabel tersebut. - Didalam fungsi
cetak
, terdapat parameter dengan namausia
. Maka, nilai 60 yang dikirim ke fungsicetak
darimain
akan disimpan kedalam variabel baru, yakniusia
. - Masih didalam fungsi
cetak
, terdapat printf yang mencetak isi konten variabelusia
.
Untuk penamaan parameter, anda boleh menyamakan nama-nya dengan nama variabel yang didalam fungsi main. Sehingga source code seperti sebagai berikut.
#include <stdio.h>void cetak(int umur)
{
printf(“Usia anda = %i \n”, umur);
}int main()
{
int umur = 60; cetak(umur); return 0;
}
Meskipun kedua variabel yang di main
dan cetak
memiliki nama serupa tetapi mereka merujuk kepada alamat memori yang berbeda. Mari buktikan dengan menggunakan operator address-of &
dimuka variabel. Operator ini akan mengembalikan alamat memori dari sebuah variabel. Saya juga akan menggunakan format %p
untuk mencetak alamat memori dengan printf.
#include <stdio.h>void cetak(int umur)
{
printf(“Alamat memori `umur` didalam `cetak` = “);
printf(“%p \n”, &umur);
}int main()
{
int umur = 17; printf(“Alamat memori `umur` didalam `main` = “);
printf(“%p \n”, &umur); cetak(umur); return 0;
}
Dengan mengcompile dan menjalankan program diatas, saya mendapatkan:
Catatan: Alamat memori di komputer saya dengan Anda akan berbeda.
Dari hasil, kita bisa melihat bahwa variabel umur
di kedua fungsi memiliki alamat memori yang berbeda sehingga meskipun nama mereka serupa namun secara teknis mereka berbeda. Dampaknya, bila anda mengubah nilai umur
didalam salah satu fungsi maka itu TIDAK akan mengubah isi variabel yang bernama serupa di fungsi lain.
#include <stdio.h>void cetak(int umur)
{
umur = 45; // mengubah umur dari 17 ke 45
printf(“Dari cetak\n”);
printf(“Umur = %i \n\n”, umur);
}int main()
{
int umur = 17; cetak(umur); printf(“Dari main\n”);
printf(“Setelah merubah var. umur didalam `cetak`: “);
printf(“Umur = %i \n”, umur); // umur masih 17 return 0;
}
hasil compile dan menjalakan sebagai berikut:
Dari cetak
Umur = 45Dari main
Setelah merubah var. umur didalam `cetak`: Umur = 17
Tidak ada perubahan nilai umur didalam fungsi main
setelah cetak
mengubah isi variabel.