void *

...posting seputar dunia pemrograman ah,
biar skillnya sdikit keliatan.. hehehe..

Pre-requisite: Ngerti apa itu pointer pada C.

Pernah gak di saat ngoding (dengan bahasa C) kamu butuh suatu variabel yang mungkin bisa jadi apa saja? Misalnya, variabel itu mungkin jadi integer, char, array, string, list of list, atau bahkan list of list of list, dan sebagainya di mana kita belum tahu apa tipenya saat didefinisikan. Kalau pernah, mungkin trik di bawah ini bisa membantu :)

Di C ada sesuatu yang namanya: void *, yang merupakan pointer ke sesuatu yang belum didefinisikan. Nah, karena void * ini menunjuk ke sesuatu yang belum didefinisikan, maka kita bisa membuat si void * ini menunjuk ke sesuatu yang bisa kita definisikan sesuka kita. Bagaimana caranya? Mungkin program kecil di bawah ini bisa membantu :)
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
// the mistery of void *
void * P;

// void * casted to char *
P = (char*) malloc (sizeof(char));
*(char*)P = 'A';
printf("P = %c\n",*(char*)P);
free(P);

// void * casted to int **
P = (int**) malloc (2 * sizeof(int*));
((int**)P)[0] = (int*) malloc (sizeof(int));
((int**)P)[1] = (int*) malloc (sizeof(int));
*((int**)P)[0] = 1;
*((int**)P)[1] = 2;
printf("P[0] = %d\n",*((int**)P)[0]);
printf("P[1] = %d\n",*((int**)P)[1]);
free(P[0]); free(P[1]); free(P);

// void * casted to float ***
P = (float***) malloc (sizeof(float**));
((float***)P)[0] = (float **) malloc (sizeof(float*));
((float***)P)[0][0] = (float *) malloc (sizeof(float));
*((float***)P)[0][0] = 1.23;
printf("P[0][0] = %f\n",*((float***)P)[0][0]);
free(P[0][0]); free(P[0]); free(P);

return 0;
}

Sebagaimana yang kita tahu (or at least, yang gue tau :P), fungsi malloc merupakan fungsi yang mengembalikan void *. Dengan menggunakan trik casting hasil malloc seperti pada contoh di atas (menambahkan (tipe_tujuan) di depan malloc), kita bisa mendapatkan tipe apapun yang kita mau pada variabel void * kita.

Lalu, jika kamu ingin mengakses atau meng-assign variabel void * itu, jangan lupa lakukan casting, dengan menambahkan (tipe_tujuan) di depan variable void *.

Okd, sekarang silakan mencoba ^_^. Semoga menjawab kebutuhan kamu. Happy coding!

9 comments :

  1. Ahaha... knp tiba2 ngomongin C? Ahh... jadi kangen. Secara C bahasa pertama yang sy suka. Kangen... ^^

    ReplyDelete
  2. @dibond:
    soalnya ni lagi ngasistenin strukdat, n anak 05 juga lagi maen-maen sama C.. =D hehehe..

    ReplyDelete
  3. Wah keliatan nih skill-nya. Hehe..
    Btw sekarang pakai anggriawan.web.id ya. Baiklah.. :D

    ReplyDelete
  4. wew, tumben ngepost yang rada teknis

    ReplyDelete
  5. Postingan ini kan juga dalam rangka memberikan pencerahan buat anak-anak IF yang lagi ngerjain tugas besar 2 Algoritma & Struktur Data..

    Semoga saja berguna.. ^_^

    ReplyDelete
  6. YOOOOOOOW....

    wew...
    ngeri ah skillnya kk Anggri ini (^_^)

    anyway tengkyu ya...
    soalnya gw cobain juga (^_^)

    ReplyDelete
  7. masih banyak yg lebih skillful kok ^^;
    silakan dicobain, kalau ada yang perlu dikoreksi, kasi tau ya.. =)

    ReplyDelete
  8. Hmm.. nambahin aja.
    *(char*)P tuh bisa aja dituliskan sebagai ((char*)P)[0].

    Jadi kita bisa menganggap si variable P sebagai array. Contoh kodenya bisa seperti ini:

    int main(int argc, char *argv[])
    {
    // the mistery of void *
    void * P;

    // void * casted to char *
    P = (char*) malloc (2*sizeof(char));
    ((char*)P)[0] = 'A';
    ((char*)P)[1] = 'B';
    printf("P = %c\n", ((char*)P)[0]);
    printf("P = %c\n", ((char*)P)[1]);
    free(P);

    return 0;
    }

    ReplyDelete
  9. @baguspewe:

    yup, bisa sih variabel P mu itu dianggap sbg array..
    itu krn P sbg tipe primitif ataupun elemen pertama P sbg array mengacu ke address yg sama..
    elemen kedua dari array P akan mengacu ke address+1 dari elemen sebelumnya, dst..

    ^__^

    ReplyDelete