Jak dotąd moje zaniżenie dotyczące wskaźnika void jest następujące.
Gdy zmienna wskaźnikowa jest zadeklarowana przy użyciu słowa kluczowego void - staje się zmienną wskaźnikową ogólnego przeznaczenia. Adres dowolnej zmiennej dowolnego typu danych (char, int, float itp.) Można przypisać do zmiennej wskaźnika void.
main()
{
int *p;
void *vp;
vp=p;
}
Ponieważ do wskaźnika void można przypisać inny wskaźnik typu danych, użyłem go w funkcji absolut_value (kod pokazany poniżej). Aby zrobić ogólną funkcję.
Próbowałem napisać prosty kod C, który przyjmuje liczbę całkowitą lub zmiennoprzecinkową jako argument i stara się, aby był + ve, jeśli jest ujemny. Napisałem następujący kod,
#include<stdio.h>
void absolute_value ( void *j)
{
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;
}
Ale otrzymywałem błąd, więc dowiedziałem się, że moje rozumienie ze wskaźnikiem void jest nieprawidłowe :(. Więc teraz przejdę do zbierania punktów, dlaczego tak jest.
Na temat wskaźników pustki muszę lepiej zrozumieć, że.
Musimy typecastować zmienną void pointer, aby ją usunąć. Dzieje się tak, ponieważ ze wskaźnikiem void nie jest powiązany żaden typ danych. W żaden sposób kompilator nie może wiedzieć (lub zgadywać?), Na jaki typ danych wskazuje wskaźnik void. Tak więc, aby wziąć dane wskazywane przez wskaźnik void, wpisujemy je na maszynie z poprawnym typem danych przechowywanych w lokalizacji void pointers.
void main()
{
int a=10;
float b=35.75;
void *ptr;
ptr=&a;
printf("The value of integer variable is= %d",*( (int*) ptr) );
ptr=&b;
printf("The value of float variable is= %f",*( (float*) ptr) );
}
Wskaźnik void może być naprawdę przydatny, jeśli programista nie jest pewien typu danych wprowadzanych przez użytkownika końcowego. W takim przypadku programista może użyć wskaźnika void, aby wskazać lokalizację nieznanego typu danych. Program można ustawić w taki sposób, aby prosić użytkownika o poinformowanie o typie danych, a rzutowanie typu może być wykonywane zgodnie z informacjami wprowadzonymi przez użytkownika. Fragment kodu znajduje się poniżej.
void funct(void *a, int z)
{
if(z==1)
printf("%d",*(int*)a);
else if(z==2)
printf("%c",*(char*)a);
else if(z==3)
printf("%f",*(float*)a);
}
Inną ważną kwestią, o której należy pamiętać w przypadku wskaźników void, jest to, że arytmetyka wskaźnika nie może być wykonywana w przypadku wskaźnika void.
void *ptr;
int a;
ptr=&a;
ptr++;
Więc teraz zrozumiałem, jaki był mój błąd. Poprawiam to samo.
Bibliografia :
http://www.antoarts.com/void-pointers-in-c/
http://www.circuitstoday.com/void-pointers-in-c .
Nowy kod jest przedstawiony poniżej.
#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;
}
Dziękuję Ci,