void*其实可以理解为一个context,利用它可以很好的实现C语言面向对象编程。我觉得使用void*,不是为了看起来合适,而是一个约定,使用C/C++编程的人员看到void*,习惯性的就会认为——这是个私有数据,只有定义的一方才有权解释;这也是我们在回调函数中传递void*作为userdata的基础共识。

void*指针其实可以用作泛型,你想象一下你在C中要交换两个变量,如果是两个整数的话,就像:

void swap_int(int* lhs, int* rhs)
{int tmp = *lhs;*lhs = *rhs;*rhs = tmp;
}

如果要交换小数,那还要写一个

void swap_float(float* lhs, float* rhs)
{;//
}

那么既然都是把两个变量的bit pattern交换一下,那就可以把这种方法抽象出来:

void swap(void* lsh, void* rhs)
{;//
}

因为你不知道究竟要交换多少个bit,所以,还需要一个参数来指定要交换的bit的数量:

void swap(void* lsh, void* rhs, size_t size)
{;//
}

有了这样一个函数,那么如果想要交换两个变量,那就可以:

swap(&ai, &bi, sizeof(int));
swap(&af, &bf, sizeof(float));

用void* 仅仅是为了“看起来”合乎逻辑

但是,用回上面的例子,如果我用float*代替void*,那的确是可以的,但是我为什么每次调用它都要先做强制类型转换swap((float* )&ai, (float* )&bi, sizeof(int)),你把这样一个接口给另外的一个人使用,他会怎么想?我擦,你交换两个整数,还要先转换为float*,万一给个新手,人家还不敢用,我擦,你这里面有什么奥妙么?

的确,void*和其他指针一样,都是占同样大小的内存空间,唯一和其他指针不同的就在于你不能对void*进行解引用,看起来其他类型的指针都可以用void*来代替,只要在解引用之前把它转换为相应类型的指针就OK了!

那么,如果是这样的话,那用void*的确是为了看起来合乎逻辑。我暂时也想不到有哪些情况是必须要用上void*的!

void* 指针有什么用相关推荐

  1. void *指针的加减运算

    1.手工写了一个程序验证void *指针加减运算移动几个字节: //本程序验证空类型指针减1移动几个字节 #include <stdio.h> int main(int argc, cha ...

  2. C语言指针高级部分:void指针和数据指针

    概念 void指针     数据指针 void指针 void指针的基本概念 void的意思就是"无类型",void指针则为"无类型指针",void指针可以指向任 ...

  3. c语言中void指针,C 语言 void指针

    C 语言 void指针 到目前为止,我们已经研究了分配给指针的地址应该与指针声明中指定的类型相同. 例如,如果我们声明了int指针,则此int指针不能指向float变量或某种其他类型的变量,即它只能指 ...

  4. [转]C/C++语言void及void指针深层探索

    1.概述 许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误.本文将对void关键字的深刻含义进行解说,并详述void及void指针类型的使用方法与技巧. 2 ...

  5. c++中的void指针和const指针

    在c++中可以声明指向void类型的指针,指向void类型的指针称为void指针,此外,在声明指针时,还可以用关键字const进行修饰,用关键字const修饰的指针称为const指针. 1.void指 ...

  6. C/C++语言void及void指针深层探索 .

    1.概述 许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误.本文将对void关键字的深刻含义进行解说,并详述void及void指针类型的使用方法与技巧. 2 ...

  7. C++中的空指针和void * 指针

    空指针(null pointer) 空指针不指向任何对象,在使用一个指针前首先要判断是否为空. 用法: int *ptr1=nullptr; //等价于int *ptr1=0; int *ptr2=0 ...

  8. C语言中的void指针

    2019独角兽企业重金招聘Python工程师标准>>> void *为"无类型指针",可以指向任何数据类型. void指针的使用规范: 1.void指针可以指向任 ...

  9. c语言中的void指针,C程序中void指针的概念

    到目前为止,我对void指针的轻描淡写如下. 当使用关键字void声明指针变量时,它将成为通用指针变量.任何数据类型(char,int,float等)的任何变量的地址都可以分配给void指针变量. m ...

  10. boost::core模块实现分配const void指针

    boost::core模块实现分配const void指针 实现功能 C++实现代码 实现功能 boost::core模块实现分配const void指针 C++实现代码 #include <b ...

最新文章

  1. 卡尔曼滤波——车定位(GPS与车运动方程)
  2. 佛吉尼亚大学计算机世界排名,弗吉尼亚大学计算机世界排名
  3. Xcode 修改系统的代码块样式 Code Snippet
  4. QUESTION-PRINCIPLE-ANSWER(SOLUTION) RELATIONSHIP
  5. 牛客2020年愚人节比赛
  6. oracle的基本概念,oracle的基本概念
  7. 【SpringMVC框架】springmvc的基础知识
  8. Oracle统计信息中的Pending Statistics
  9. SpringMVC_day1
  10. Illustrator 教程,如何在 Illustrator 中设计插画?
  11. 2012考研数学二第(3)题——数列收敛与部分和有界的关系
  12. 王垠—写给清华大学的退学申请
  13. 程序员应该如何培养自己的人脉关系
  14. 数值微积分与方程求解
  15. 【2022国赛模拟】摆(bigben)——行列式、杜教筛
  16. 工具人实锤!我用java中的文件IO流帮同事处理了足足18M的文本数据,泪目(一)
  17. 处女作真人语音计算器上线了
  18. n维椭球体积公式_初中化学知识点:物质的量及其计算公式
  19. Docker 入门教程 - 2021 最新版(上)
  20. DO DIFFERENT TRACKING TASKS REQUIRE DIFFERENT APPEARANCE MODELS?——阅读笔记

热门文章

  1. iconv php gbk utf8,PHP通过iconv将字符串从GBK转换为UTF8字符集
  2. csharp c++
  3. SQL server 计算当前日期为一年中的第几周,以周五/周一作为一周中的第一天
  4. 网站安全不可忽视--一个收费网站的破解过程
  5. 【求助】ssh.service loaded(inactive) 问题
  6. 技术支持程序员程序书写规范
  7. 计算机cpu的速度越来越快 这导致,计算机一级笔试模拟题(1-6)
  8. 华为 2017 实习生招聘笔试题
  9. Windows系统必备的软件
  10. ARM汇编寄存器和常用指令详解