Пока что мое занижение на указателе void выглядит следующим образом.
Когда переменная-указатель объявляется с использованием ключевого слова void - она становится переменной-указателем общего назначения. Адрес любой переменной любого типа данных (char, int, float и т. Д.) Может быть назначен переменной void-указателя.
main()
{
int *p;
void *vp;
vp=p;
}
Так как указатель другого типа данных может быть назначен пустому указателю, поэтому я использовал его в функции absolut_value (код показан ниже). Чтобы сделать общую функцию.
Я попытался написать простой код на C, который принимает целое число или число с плавающей точкой в качестве аргумента и пытается сделать его + ve, если он отрицательный. Я написал следующий код,
#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;
}
Но я получал ошибку, поэтому я узнал, что мое понимание с указателем пустоты неверно :(. Так что теперь я перейду к тому, чтобы собирать баллы, почему это так.
Вещи, которые мне нужно понять больше о пустых указателях, таковы.
Нам нужно типизировать переменную void-указателя, чтобы разыменовать ее. Это связано с тем, что с пустым указателем не связан тип данных. Компилятор не может знать (или догадаться?), На какой тип данных указывает указатель void. Таким образом, чтобы взять данные, на которые указывает указатель void, мы типизируем их с правильным типом данных, хранящихся в расположении указателей void.
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, чтобы указать местоположение неизвестного типа данных. Программа может быть настроена таким образом, чтобы запросить у пользователя информацию о типе данных, и приведение типа может быть выполнено в соответствии с информацией, введенной пользователем. Фрагмент кода приведен ниже.
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
}
Еще один важный момент, который вы должны помнить о пустых указателях, заключается в том, что - арифметика указателей не может быть выполнена в пустых указателях.
void *ptr;
int a;
ptr=&a;
ptr++; // This statement is invalid and will result in an error because 'ptr' is a void pointer variable.
Так что теперь я понял, в чем была моя ошибка. Я исправляю то же самое.
Рекомендации:
http://www.antoarts.com/void-pointers-in-c/
http://www.circuitstoday.com/void-pointers-in-c.
Новый код, как показано ниже.
#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;
}
Спасибо,