Kamis, 02 Juni 2022

Pointer , Function Pointer, Void Pointer | Bahasa C

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.

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