先分享一段代码,觉得很有意思
#include
void* say_hello(void* args){std::cout<< "Hello world"<< std::endl;return 0;
}
上面这段代码,我们看到函数的返回值类型竟然是 void* ,形参也是 void* ,按照一般的理解,如果返回值和形参都是 void 的,那么返回值直接写一个 void 的,形参直接不写就可以。为什么要这样多此一举了 ?
在C语言中,*类型就是指针类型,比如 int *p ,double* q 。这个虽然是不一样的指针,但是大小是一样的(sizeof(p) == sizeof(q)),因为他们都是同一种 *类型(或者因为他们保存的是变量的地址,而变量地址大小由于系统结构决定),那int *p ,double* q到底有什么不同 ? 看下图

这就是它的神奇之处了,我们可以自己控制在需要的时候将它实现为需要的类型。这样做的好处就是节约代码,实现泛型编程。
正常来说如果两个指针类型不一样的话,两个指针变量是不可以直接相等 赋值得,例如: int *a , float *b ,如果令: a=b 这个是会编译报错的,但是void* 指针可以等于任何类型的指针。
int * a ;
float *f;
a= b; // 编译会报错的
void* pv;
float f = 5.5;
float* pf = &f;
pv = pf; // 这样是没问题
// void* 类型指针解析#include
using namespace std;int main() {void* pv;float f = 5.5;float* pf = &f;pv = pf;//cout << *pv << endl; // 语法错误:表达式必须是指向完整对象类的指针cout << *(float*)pv << endl; //强制类型转换后,可以取值
}// 打印结果: 5.5
void *pv = 0;
void *pv2 = NULL;
cout<
cout<
// void* 类型指针解析#include
using namespace std;void* test(void* a) {return a;
}int main() {static int a = 5;int* pi = &a;cout << "变量a的地址:" << &a << endl;cout << pi << endl; // 输出变量a的地址cout << test(pi) << endl;cout << test((void*)pi) << endl;}变量a的地址:00C2C000
00C2C000
00C2C000
00C2C000
void function(int dataType, void* data) {// 根据dataType的不同值,进行不同的转换switch (dataType) {case 0:int* a = (int*)data;case 1:char* a = (char*)data;...}
void * memcpy(void *dest, const void *src, size_t len);
void * memset ( void * buffer, int c, size_t num );
memcpy和memset 对外接收任何类型的指针,这样是合理且必要的,因为这是内存操作函数,是对bit 进行操作,考虑数据的类型事没有任何意义的 。
同样的,malloc函数只关注你要多大内存,你申请到这个内存之后,至于你怎么使用划分是你自己的事情,但是你需要显示的表明你是怎么划分的,所以这里需要将 void* 类型转化为具体的数据类型
int *a=NULL;
a=(int *)malloc(sizeof(int));//返回的是void*,所以赋值给其他指针类型要强转一下
上一篇:第二个字是虎的成语有哪些