C/C++下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。

时间: 2024-09-26 06:55:15

C/C++下void*类型指针介绍的相关文章

c语言-c中不同类型指针之间的转换

问题描述 c中不同类型指针之间的转换 不同类型的指针为什么可以装换,例如: void * a; char c=a; a=(void * ) &c; 指针不就是一个地址在里面么,有什么好转换的? 解决方案 指针的本质是都一样的,转换类型是让编译器知道怎么看所指向的内容. 解决方案二: 只有转换了才能通过编译 不同的指针 ++ --等结果也不同 sizeof也不同 解决方案三: 不同类型之间的转换C 不同类型指针的相互转化不同数字类型之间的转换---------------------- 解决方案四

PHP中的类型约束介绍

  这篇文章主要介绍了PHP中的类型约束介绍,PHP的类方法和函数中可实现类型约束,但参数只能指定类.数组.接口.callable 四种类型,参数可默认为NULL,PHP并不能约束标量类型或其它类型,需要的朋友可以参考下 PHP的类方法和函数中可实现类型约束,但参数只能指定类.数组.接口.callable 四种类型,参数可默认为NULL,PHP并不能约束标量类型或其它类型. 如下示例: 代码如下: class Test { public function test_array(array $ar

结构体类型指针做函数参数(C++)

因为用到了这块,所以转了一篇文章. 原文地址http://blog.sina.com.cn/s/blog_5f777ddd0100chbl.html 设有学生情况登记表如图所示,用选择排序法对该表按从小到大进行排序. 学生情况登记表 学号num 姓名name[8] 性别sex 年龄age 成绩score 101 zhang m 19 95.6 102 zhao m 20 89.0 103 wang f 18 96.5 104 shan m 20 94.0 105 chen f 20 76.5 1

C++中野指针和空指针和无类型指针

一. 野指针 所谓的野指针指的是一个指针变量指向了不可使用的内存空间. 产生野指针三个原因: (1)指针变量创建时候没有被初始化:任何指针变量在创建的时候,不会自动成为NULL指针,它的默认值是随机的,因此该指针就会成为一个野指针,可能指向一块不可使用的内存空间.          例如char *p;  这样创建一个指针p,指向一个随机的内存地址空间          所以指针在创建的时候要被初始化,可以讲其初始化为NULL,或指向合法的内存空间          比如 char *p = N

c-如何定义一个自增之后在二维数组中移动到下一行的指针?

问题描述 如何定义一个自增之后在二维数组中移动到下一行的指针? 如何定义一个自增之后在二维数组中移动到下一行的指针?如何定义一个自增之后在二维数组中移动到下一行的指针? 解决方案 自增是不能移动到下一行的,自增实现的是++, 解决方案二: 用二重数组,比如 int ** arr; arr += 第一维长度; 解决方案三: int a[m][n]={""}; *a+1;表示下一行; *(a+1):表示下一个元素位置. 若果now<n,移动到x行的当前位置:a[m*x+now]. 解

vs2012-C++ void 符号常量指针

问题描述 C++ void 符号常量指针 初学 C++ 编译器(vs2012)上有这样一段代码无法编译:typedef void far * XMSDRIVER; 在 * 处提示错误 "应输入:" 关于 far 的定义如下: #ifndef FAR #ifdef NEED_FAR_POINTERS #define FAR far #else #define FAR #endif #endif 解决方案 typedef void* XMSDRIVER; 解决方案二: typedef vo

无法将void类型转换为string

问题描述 usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;usingSystem.Web.UI;usingSystem.Web.UI.WebControls;usingcn.com.webxml.webservice;publicpartialclass验证码:System.Web.UI.Page{protectedvoidPage_Load(objectsender,EventArgse)

C#下怎么从指针指向的byte数组转换成bitmap类型

问题描述 如题,用的Basler家的GiE相机,使用官方提供的库文件,抓取图像后返回图像数组指针到主窗口下,希望显示在PictureBox控件,请指教-具体点的话,数组长度和图像分辨率是已知的,8位灰度图像,数组为一维Byte类型的数组,按行存储,一个Byte就是一个像素点:这里实现了再改用12位量化来提高测量的精度.C#下返回一个IntPtr类型的指针上位机接触不多,还请多指教 解决方案 解决方案二:建议两种方法你可以试一下,1.确定图像大小,setpixel逐点设置:2.lockbits,指

C语言之free函数以及野指针介绍

以下是对C语言中的free函数与野指针进行了详细的分析介绍,需要的朋友可以参考下   [FROM MSDN && 百科]原型:void free(void *ptr); #include<stdlib.h>或#include <malloc.h> Deallocate space in memory 释放ptr指向的存储空间.被释放的空间通常被送入可用存储区池,以后可在调用malloc.realloc以及realloc函数来再分配.注意:连续两次使用free函数,肯