C/C++培训
达内IT学院
400-996-5531
说到C就不得不提指针,而一提到指针,有一个是比较特殊的,那就是void*。void*到底是怎样的存在?又是如何使用的?实际上我们在很多接口中都会发现它们的参数类型都是void*,例如:
ssize_t read(int fd, void *buf, size_t count);
void *memcpy(void *dest, const void *src, size_t );
为何要如此设计?因为对于这种通用型接口,你不知道用户的数据类型是什么,但是你必须能够处理用户的各种类型数据,因而会使用void*。void*能包容地接受各种类型的指针。
也就是说,如果你期望接口能够接受任何类型的参数,你可以使用void*类型。
但是在具体使用的时候,你必须转换为具体的指针类型。例如,你传入接口的是int*,那么你在使用的时候就应该按照int*使用。
注意
使用void*需要特别注意的是,你必须清楚原始传入的是什么类型,然后转换成对应类型。例如,你准备使用库函数qsort进行排序:
void qsort(void *base,size_t nmemb,size_t size , int(*compar)(const void *,const void *));
它的第三个参数就是比较函数,它接受的参数都是const void*,如果你的比较对象是一个结构体类型,那么你自己在实现compar函数的时候,也必须是转换为该结构体类型使用。
举个例子,你要实现学生信息按照成绩比较:
typedef struct student_tag
{
char name[STU_NAME_LEN]; //学生姓名
unsigned int id; //学生学号
int score; //学生成绩
}student_t;
int studentCompare(const void *stu1,const void *stu2)
{
/*强转成需要比较的数据结构*/
student_t *value1 = (student_t*)stu1;
student_t *value2 = (student_t*)stu2;
return value1->score-value2->score;
}
在将其传入studentCompare函数后,必须转换为其对应的类型进行处理。
总结:
void*很强大,但是一定要在合适的时候使用;同时强转很逆天,但是一定要注意前后的类型是否真的能正确转换。
通俗地说void*:
这里有一片内存数据,我也不知道什么类型,给你了,你自己想怎么用怎么用吧,不过要用对奥!
当你还在担心能否就业时,达内学员提前被企业录取;当你转辗于各大招聘会时,达内学员收到了高薪offer;当你在各大招聘网站投递简历时,达内学员中有人一毕业进入五百强名企。所以选择很重要。找C++培训班,选达内就对了。
填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!
Copyright © 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有
Tedu.cn All Rights Reserved