更多课程 选择中心

C/C++培训
达内IT学院

400-996-5531

C中的void*是如何使用的?

  • 发布:C++培训
  • 来源:C++资讯
  • 时间:2020-06-24 16:11

说到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++培训班,选达内就对了。

预约申请免费试听课

填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:Linux系统及与windows相比优点在哪里?
下一篇:在C中嵌套汇编代码难吗?

C语言宏定义的几种使用方法

C与C++内存管理避坑指南

C/C++代码规范注释有哪些讲究?

C语言中,全局变量滥用的后果竟如此严重?

Copyright © 2023 Tedu.cn All Rights Reserved 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有

选择城市和中心
黑龙江省

吉林省

河北省

湖南省

贵州省

云南省

广西省

海南省