Sejauh ini pernyataan saya tentang void pointer adalah sebagai berikut.
Ketika variabel pointer dinyatakan menggunakan kata kunci void - itu menjadi variabel pointer tujuan umum. Alamat variabel apa pun dari tipe data apa pun (char, int, float dll.) Dapat ditetapkan ke variabel penunjuk kosong.
main()
{
int *p;
void *vp;
vp=p;
}
Karena pointer tipe data lain dapat ditugaskan ke void pointer, jadi saya menggunakannya dalam fungsi absolut_value (kode yang ditunjukkan di bawah). Untuk membuat fungsi umum.
Saya mencoba untuk menulis kode C sederhana yang mengambil integer atau float sebagai argumen dan mencoba membuatnya + ve, jika negatif. Saya menulis kode berikut,
#include<stdio.h>
void absolute_value ( void *j) // works if used float, obviously it must work but thats not my interest here.
{
if ( *j < 0 )
*j = *j * (-1);
}
int main()
{
int i = 40;
float f = -40;
printf("print intiger i = %d \n",i);
printf("print float f = %f \n",f);
absolute_value(&i);
absolute_value(&f);
printf("print intiger i = %d \n",i);
printf("print float f = %f \n",f);
return 0;
}
Tapi saya mendapatkan kesalahan, jadi saya tahu bahwa pemahaman saya dengan void pointer tidak benar :(. Jadi sekarang saya akan bergerak ke arah untuk mengumpulkan poin mengapa begitu.
Hal-hal yang perlu saya pahami lebih lanjut tentang void pointer adalah itu.
Kita perlu mengetikkan variabel void pointer untuk melakukan dereferensi. Ini karena void pointer tidak memiliki tipe data yang terkait dengannya. Tidak ada cara kompiler dapat mengetahui (atau menebak?) Tipe data apa yang ditunjuk oleh void pointer. Jadi untuk mengambil data yang ditunjuk oleh void pointer kita mengetikkannya dengan tipe data yang benar yang disimpan di dalam lokasi void pointer.
void main()
{
int a=10;
float b=35.75;
void *ptr; // Declaring a void pointer
ptr=&a; // Assigning address of integer to void pointer.
printf("The value of integer variable is= %d",*( (int*) ptr) );// (int*)ptr - is used for type casting. Where as *((int*)ptr) dereferences the typecasted void pointer variable.
ptr=&b; // Assigning address of float to void pointer.
printf("The value of float variable is= %f",*( (float*) ptr) );
}
Void pointer bisa sangat berguna jika programmer tidak yakin tentang tipe data dari data yang dimasukkan oleh pengguna akhir. Dalam kasus seperti itu, programmer dapat menggunakan void pointer untuk menunjuk ke lokasi tipe data yang tidak dikenal. Program ini dapat diatur sedemikian rupa untuk meminta pengguna untuk menginformasikan tipe data dan tipe casting dapat dilakukan sesuai dengan informasi yang dimasukkan oleh pengguna. Cuplikan kode diberikan di bawah ini.
void funct(void *a, int z)
{
if(z==1)
printf("%d",*(int*)a); // If user inputs 1, then he means the data is an integer and type casting is done accordingly.
else if(z==2)
printf("%c",*(char*)a); // Typecasting for character pointer.
else if(z==3)
printf("%f",*(float*)a); // Typecasting for float pointer
}
Poin penting lain yang harus Anda ingat tentang void pointer adalah bahwa - pointer aritmatika tidak dapat dilakukan dalam void pointer.
void *ptr;
int a;
ptr=&a;
ptr++; // This statement is invalid and will result in an error because 'ptr' is a void pointer variable.
Jadi sekarang saya mengerti apa kesalahan saya. Saya mengoreksi hal yang sama.
Referensi :
http://www.antoarts.com/void-pointers-in-c/
http://www.circuitstoday.com/void-pointers-in-c .
Kode baru seperti yang ditunjukkan di bawah ini.
#include<stdio.h>
#define INT 1
#define FLOAT 2
void absolute_value ( void *j, int *n)
{
if ( *n == INT) {
if ( *((int*)j) < 0 )
*((int*)j) = *((int*)j) * (-1);
}
if ( *n == FLOAT ) {
if ( *((float*)j) < 0 )
*((float*)j) = *((float*)j) * (-1);
}
}
int main()
{
int i = 0,n=0;
float f = 0;
printf("Press 1 to enter integer or 2 got float then enter the value to get absolute value\n");
scanf("%d",&n);
printf("\n");
if( n == 1) {
scanf("%d",&i);
printf("value entered before absolute function exec = %d \n",i);
absolute_value(&i,&n);
printf("value entered after absolute function exec = %d \n",i);
}
if( n == 2) {
scanf("%f",&f);
printf("value entered before absolute function exec = %f \n",f);
absolute_value(&f,&n);
printf("value entered after absolute function exec = %f \n",f);
}
else
printf("unknown entry try again\n");
return 0;
}
Terima kasih,