Пока что я недооцениваю указатель void следующим образом.
Когда переменная-указатель объявляется с использованием ключевого слова void - она становится переменной-указателем общего назначения. Адрес любой переменной любого типа данных (char, int, float и т. Д.) Может быть назначен переменной-указателю типа void.
main()
{
int *p;
void *vp;
vp=p;
}
Поскольку указатель на другой тип данных может быть назначен указателю void, я использовал его в функции 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, мы приводим его к правильному типу данных, хранящихся внутри местоположения указателей 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, чтобы указать на местоположение неизвестного типа данных. Программа может быть настроена таким образом, чтобы запрашивать у пользователя информацию о типе данных, и приведение типов может выполняться в соответствии с информацией, введенной пользователем. Ниже приведен фрагмент кода.
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;
}
Спасибо,