到目前为止,我们已经研究了分配给指针的地址应与指针声明中指定的类型相同。例如,如果我们声明了int指针,则此int指针不能指向float变量或某种其他类型的变量,即,它只能指向int类型的变量。为了克服这个问题,我们使用了指向void的指针。指向void的指针表示可以指向任何数据类型的通用指针。我们可以将任何数据类型的地址分配给void指针,并且可以将void指针分配给任何类型的指针,而无需执行任何显式的类型转换。
void *pointer name;
以下给出了void指针的声明:
void *ptr;
在上面的声明中,void是指针的类型,而'ptr'是指针的名称。
让我们考虑一些示例:
int i = 9; //整数变量初始化。
int * p; //整数指针声明。
float* fp; //浮动指针声明。
void* ptr; //void指针声明。
p = fp; //不正确。
fp=&i; //不正确
ptr = p; //正确
ptr = fp; //正确
ptr=&i; //正确
C语言中void指针的大小与字符类型的指针的大小相同。根据C感知,指向void的指针的表示形式与字符类型的指针相同。指针的大小将根据所使用的平台而有所不同。
让我们看下面的示例:
#include <stdio.h> int main() { void *ptr = NULL; //空指针 int *p = NULL;// 整数指针 char *cp = NULL;// 字符指针 float *fp = NULL;// 浮动指针 //空指针的大小 printf("size of void pointer = %d\n\n",sizeof(ptr)); //整数指针的大小 printf("size of integer pointer = %d\n\n",sizeof(p)); //字符指针的大小 printf("size of character pointer = %d\n\n",sizeof(cp)); //浮点指针的大小 printf("size of float pointer = %d\n\n",sizeof(fp)); return 0; }
输出
#include <stdio.h> #include<malloc.h> int main() { int a=90; int *x = (int*)malloc(sizeof(int)) ; x=&a; printf("Value which is pointed by x pointer : %d",*x); return 0; }
输出
C中的void指针不能直接取消引用。让我们看下面的例子。
#include <stdio.h> int main() { int a=90; void *ptr; ptr=&a; printf("Value which is pointed by ptr pointer : %d",*ptr); return 0; }
在上面的代码中,* ptr是一个空指针,它指向整数变量" a"。我们已经知道不能取消引用void指针,因此上面的代码将给出编译时错误,因为我们直接打印指针ptr指向的变量的值。
输出
现在,我们重写上面的代码以消除错误。
#include <stdio.h> int main() { int a=90; void *ptr; ptr=&a; printf("Value which is pointed by ptr pointer : %d",*(int*)ptr); return 0; }
在上面的代码中,我们使用下面给出的语句将void指针转换为整数指针:
(int *)ptr;
然后,使用下面给出的语句,打印由空指针" ptr"指向的变量的值:
*(int *)ptr;
输出
我们不能直接对C中的void指针应用算术运算。我们需要应用适当的类型转换,以便可以对void指针执行算术运算。
链接:https://www.learnfk.comhttps://www.learnfk.com/c-programming/void-pointer-in-c.html
来源:LearnFk无涯教程网
让我们看下面的示例:
#include<stdio.h> int main() { float a[4]={6.1,2.3,7.8,9.0}; void *ptr; ptr=a; for(int i=0;i<4;i++) { printf("%f,",*ptr); ptr=ptr+1; //错误. }}
上面的代码显示了编译时错误,即" invalid use of void expression",因为我们无法直接对void指针应用算术运算,即ptr = ptr + 1。
让我们重写上面的代码以消除错误。
#include<stdio.h> int main() { float a[4]={6.1,2.3,7.8,9.0}; void *ptr; ptr=a; for(int i=0;i<4;i++) { printf("%f,",*((float*)ptr+i)); }}
上面的代码成功运行,因为我们对void指针即(float *)ptr应用了正确的转换,然后对*((float *)ptr + i)应用了算术运算。
输出
由于其可重用性,我们使用空指针。空指针可以存储任何类型的对象,并且我们可以通过使用带有适当类型转换的间接操作符来检索任何类型的对象。
通过示例让我们理解。
#include<stdio.h> int main() { int a=56;// 整数变量“a”的初始化。 float b=4.5;// 浮点变量“b”的初始化。 char c='k';// 字符变量'c'的初始化。 void *ptr;// void 指针的声明。 // 分配变量'a'的地址。 ptr=&a; printf("value of 'a' is : %d",*((int*)ptr)); // 分配变量'b'的地址。 ptr=&b; printf("\nvalue of 'b' is : %f",*((float*)ptr)); // 分配变量'c'的地址。 ptr=&c; printf("\nvalue of 'c' is : %c",*((char*)ptr)); return 0; }
输出
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)