void *

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 *.

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

No comments :