C/C++下void*类型指针介绍

简介:            写C/C++程序经常会遇到void*类型的指针,以前对于这种指针没有去深究,只要程序可以正常运行就得过且过了,今天在网上搜了一些资料,才算是对这个void*类型指针有了更多的认识。            void*顾名思义就是不指向任何对象的指针,也被称为通用指针或者是泛型指针。也是C语言下“纯粹地址”(raw address)的一种约定。void*仅仅指示一个地址

           写C/C++程序经常会遇到void*类型的指针,以前对于这种指针没有去深究,只要程序可以正常运行就得过且过了,今天在网上搜了一些资料,才算是对这个void*类型指针有了更多的认识。

           void*顾名思义就是不指向任何对象的指针,也被称为通用指针或者是泛型指针。也是C语言下“纯粹地址”(raw address)的一种约定。void*仅仅指示一个地址,但是因为其不指向任何类型的对象,所以当得到一个void*类型指针指向的一段内存时,并不能直接使用void*指针对该内存进行操作,而必须用相应的类型指针来操作:比如该段内存时一段字符串,那么可以用char*来进行操作。

        之所以设计出void*这种类型的指针,设计者的主要思路我想估计有一下这么两个:

  •    对函数返回值以及参数的限制
  •    方便通用函数的设计
  •    方便内存操作

       对函数返回值以及参数的限制:

        在c/c++下申明的函数如果没有返回值,那么就必须将其的返回类型设置为void,这是因为如果不标明其返回类型,那么编译器会默认其返回类型是int,所以需要用void来进行限定。

        另外就是在c++下,如果向一个没有参数的函数传入参数时,编译器会报错,这也是因为该函数的参数的void。

     方便通用函数的设计:

        如果一个函数是针对各种类型的数据都适用的时候,这个时候就应该适用void*类型作为参数,因为首先void*类型的指针可以转换为各种类型的指针,然后再针对这些具体类型做进一步操作。当然很多人会说,其实传入char*指针也可以实现这种功能。确实可以,但是这样会造成不必要的误会,让用户以为这个函数只能对字符串进行处理,而不是适用各种函数。

        我们经常使用到的内存复制和赋值函数就都是以void*为指针:

void * memcpy(void *dest, const void *src, size_t len); 
void * memset ( void * buffer, int c, size_t num ); 

    方便内存操作:

        void*指针最重要的的作用我想还是进行内存操作。一段内存里可能含有各种不同数据类型,如果要将一段内存共享或者发送给其他主机时,以void*类型的指针来代表该段内存是最好的选择。

<span style="font-size:14px;">void * memcpy(void *dest, const void *src, size_t len); 
void * memset ( void * buffer, int c, size_t num ); </span>
        还是以这两个函数为例,这两个函数都涉及到内存操作,都无一例外地使用void*类型作为参数类型也证明了这一点。值得注意的是,在传入一个void*类型的指针的时候,通常还需要传入一个int型的参数作为该段内存的大小,如以上两个函数的len和num,这里的len和num指示的长度是byte。虽然在void*不支持任何数学操作,但是一个void对象其实和char一样,代表一个byte。

相关文章
|
7天前
|
存储 安全 编译器
在 C++中,引用和指针的区别
在C++中,引用和指针都是用于间接访问对象的工具,但它们有显著区别。引用是对象的别名,必须在定义时初始化且不可重新绑定;指针是一个变量,可以指向不同对象,也可为空。引用更安全,指针更灵活。
|
25天前
|
存储 C++
c++的指针完整教程
本文提供了一个全面的C++指针教程,包括指针的声明与初始化、访问指针指向的值、指针运算、指针与函数的关系、动态内存分配,以及不同类型指针(如一级指针、二级指针、整型指针、字符指针、数组指针、函数指针、成员指针、void指针)的介绍,还提到了不同位数机器上指针大小的差异。
24 1
|
26天前
|
存储 编译器 C语言
C++入门2——类与对象1(类的定义和this指针)
C++入门2——类与对象1(类的定义和this指针)
22 2
|
28天前
|
存储 安全 编译器
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(一)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
28天前
|
C语言 C++
【C语言】指针篇-一篇搞定不同类型指针变量-必读指南(3/5)
【C语言】指针篇-一篇搞定不同类型指针变量-必读指南(3/5)
|
1月前
|
存储 C++ 索引
C++函数指针详解
【10月更文挑战第3天】本文介绍了C++中的函数指针概念、定义与应用。函数指针是一种指向函数的特殊指针,其类型取决于函数的返回值与参数类型。定义函数指针需指定返回类型和参数列表,如 `int (*funcPtr)(int, int);`。通过赋值函数名给指针,即可调用该函数,支持两种调用格式:`(*funcPtr)(参数)` 和 `funcPtr(参数)`。函数指针还可作为参数传递给其他函数,增强程序灵活性。此外,也可创建函数指针数组,存储多个函数指针。
|
27天前
|
算法 C++
【算法】双指针+二分(C/C++
【算法】双指针+二分(C/C++
|
28天前
|
存储 编译器 程序员
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(二)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
14天前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
19 4
|
14天前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
16 4