原文在此。
void指针,是没有指定数据类型的指针。void指针可以容纳任何类型的指针,并且可以转换到任何类型。
int a = 10;
char b = 'x';
void *p = &a; // void pointer holds address of int 'a' ---void指针保存整数'a'的地址
p = &b; // void pointer holds address of char 'b' ---void指针保存字符'b'的地址
void指针的好处
1)malloc()和calloc()返回void*类型,使得它们能够分配任何数据类型的内存(只是因为void*)
int main(void)
{
// Note that malloc() returns void * which can be
// typecasted to any type like int *, char *, ..
int *x = malloc(sizeof(int) * n);
}
上面的代码要在C中编译,若是在C++中,我们要做显式的类型转换,把返回值强制为 int* 。
2)用来在C中实现通用函数。如 qsort()使用的比较函数。
举一些例子:
(1)void指针不能被解引用。如下面的程序不能编译通过:
#include<stdio.h>
int main()
{
int a = 10;
void *ptr = &a;
printf("%d", *ptr);
return 0;
}
输出:
编译错误:'void *'不是对象指针类型
做指针类型转换后,可以很好的运行。
#include<stdio.h>
int main()
{
int a = 10;
void *ptr = &a;
printf("%d", *(int *)ptr);
return 0;
}
输出:
10
(2)C标准不允许使用void指针做数学运算。但是,在GNU C中是允许的,它将void的尺寸认作1 。如下面的程序在GCC中可以编译且运行。
#include<stdio.h>
int main()
{
int a[2] = {1, 2};
void *ptr = &a;
ptr = ptr + sizeof(int); ---修改了ptr的地址,位移增加1个int的长度
printf("%d", *(int *)ptr);
return 0;
}
输出:
2
需要注意的是,上面的程序在别的编译器中可能不会工作。
引用:
http://stackoverflow.com/questions/20967868/should-the-compiler-warn-on-pointer-arithmetic-with-a-void-pointer
http://stackoverflow.com/questions/692564/concept-of-void-pointer-in-c-programming