到目前为止,我对 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 指针位置中保存的正确数据类型对其进行类型转换。
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 指针,您应该记住的另一个重要点是 – 指针算术不能在 void 指针中执行。
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;
}
谢谢,