Pointer
Pada pembahasan sebelumnya kita membahas tentang array dan function. Maka kali ini kita akan membahas tentang pointer. Bahasa C merupakan bahasa level rendah yang bisa dengan mudah mengakses lokasi memori.
Tabel Konten
Sebagai contoh dalam penggunaan fungsi scanf() yang menempatkan nilai dan tempat memori pada suatu variabel dengan menggunakan simbol &.
#include <stdio.h>
int main(void)
{
int angka;
printf("masukan angka yang diinginkan : ");
scanf("%d", &angka); //ini yang dimaksud pointer
printf("\n Angka yang kamu masukan ialah %d \n", angka);
return 0;
}
Contoh program sederhana diatas merupakan contoh penggunaan pointer. Lalu bagaimana kita mengakses dan mengetahui alamat memori dari suatu variabel? Sebuah alamat memori diberikan seperti angka hexadesimal yakni
#include <stdio.h>
int main(void)
{
int angka;
printf("masukan angka yang diinginkan : ");
scanf("%d", &angka); //ini yang dimaksud pointer
printf("\n Angka yang kamu masukan ialah %d \n", angka);
printf("Alamat memorinya dari variabel angka yakni %x \n", &angka);
return 0;
}
Ini juga berlaku pada variabel di dalam fungsi yang bisa dilihat pada contoh program ini
#include <stdio.h>
void tes(int angka);
int main()
{
int z = 4;
printf("Alamat memori dari z adalah %x \n", &z);
tes(z);
printf("Alamat memori dari z adalah %x \n", &z);
tes(z);
return 0;
}
void tes(int angka)
{
printf("alamat dari variabel angka pada fungsi tes yakni %x \n", &angka);
}
Memori yang dipakai untuk dua variabel itu sama dari kurung buka sampai tutup dari kurung.
Function Pointer
Pointer bisa digunakan di dalam fungsi yang lainya. Sebagaimana dari sifat poiter yang memiliki alamat memorinya dan nilainya tersendiri. Untuk menggunakan function poiter atau pointer di fungsi kita bisa menggunakan formasi seperti
return_type (*func_name)(parameter)
Untuk praktiknya mari kita buat file bernama poin2func.c dengan isi file sebagai berikut:
#include <stdio.h>
void katakan_hello(int perulangan ); // inisiasi pointer
int main(void)
{
void (*func_poin)(int); //function pointer
func_poin = katakan_hello;//menginisiasi pointer ke function pointer
func_poin(3);// memasukan nilai sekaligus memanggil pointer
return 0;
}
void katakan_hello(int perulangan)
{
int x;
for (x = 0; x < perulangan; x++)
{
printf("Hallo Programmer \n");
}
}
Pada baris ke 6 dari file poin2func tersebut kita bisa menambahkan & pada kode func_poin = &katakan_hello; dan Juga kita bisa menggunakan tanda kurung dan * untuk memasukan nilai sekaligus memanggil pointer pada baris ke 7 seperti(*func_poin)(3); atau menjadi (func_poin)(3); Penggunaan * tidak masalah dalam baris kode itu.
Void Pointer
Void pointer merupakan pointer yang digunakannuntuk mengembalikan ke tipe alamat apapun. Walaupun alamat itu digunakan pada tipe-tipe data yang berbeda. Cara mendeklarasikanya yakni dengan format:
void *ptr;
Untuk memahaminya mari kita buat file voidPoin.c yang berisi kode ini:
#include <stdio.h>
int main(void)
{
int x = 12;
float y = 3.4;
char c ="l";
void *ptr;
ptr = &x;
printf("void ptr menunjuk pada %d \n", *((int *)ptr));
ptr = &y;
printf("void ptr menunjuk pada %f \n", *((float *)ptr));
ptr = &c;
printf("void ptr menunjuk pada %c \n", *((char *)ptr));
return 0;
}
Void pointer juga biasanya digunakan untuk mendeklarasikan function. Sebagai contoh pada kode void * kotak(const void *);. kode void * digunakan untuk semua tipe data yang akan digunakan sedangkan kata const digunakan untuk membuat tipe data nilai yang digunakan tetap sama. Sebagai dalam file voidPoin2.c :
#include <stdio.h>
void * kotak(const void * sisi);
int main(void)
{
int a, ktk;
a = 7;
ktk = kotak(&a);
printf("panjang sisi kotak %d dan luasnya %d \n", a, ktk);
return 0;
}
void * kotak(const void * sisi)
{
int luas;
luas = (*(int *) sisi) * (*(int *)sisi);
return luas;
}
Contoh program pengurutan.c
Program ini menggunakan qsort yang ada pada pustaka stdlib.h. Lalu kita menggunakan void pointer bandingkan.
#include <stdio.h>
#include <stdlib.h>
int bandingkan (const void *, const void *);
int main() {
int arr[5] = {52, 23, 56, 19, 4};
int num, width, i;
num = sizeof(arr)/sizeof(arr[0]);
width = sizeof(arr[0]);
qsort((void *)arr, num, width, bandingkan);
for (i = 0; i < 5; i++)
printf("%d ", arr[ i ]);
return 0;
}
int bandingkan (const void *elem1, const void *elem2) {
if ((*(int *)elem1) == (*(int *)elem2))
return 0;
else if ((*(int *)elem1) < (*(int *)elem2))
return -1;
else
return 1;
}
Tidak ada komentar:
Posting Komentar