转载自:http://blog.csdn.net/lee_shuai

指针有两个属性:指向变量/对象的地址和长度,但是指针只存储地址,长度则取决于指针的类型;编译器根据指针的类型从指针指向的地址向后寻址,指针类型不同则寻址范围也不同,比如:

int*从指定地址向后寻找4字节作为变量的存储单元
double*从指定地址向后寻找8字节作为变量的存储单元

void即“无类型”,void *则为“无类型指针”,可以指向任何数据类型。

1  void的作用

1)   对函数返回的限定

a)  当函数不需要返回值时,必须使用void限定。例如: voidfunc(int, int);

2)   对函数参数的限定

a)  当函数不允许接受参数时,必须使用void限定。例如: intfunc(void)。

2  void* 指针意义
2.1   void类型指针可以指向任意类型的数据,即可用任意数据类型的指针对void指针赋值。

int *pint;
void *pvoid; //它没有类型,或者说这个类型不能判断出指向对象的长度
pvoid = pint; //只获得变量/对象地址而不获得大小,但是不能 pint =pvoid;

2.2   如果要将pvoid赋给其他类型指针,则需要强制类型转换如:

pint = (int *)pvoid;  //转换类型也就是获得指向变量/对象大小

2.3   void指针不能解引用(即取内容的意思)

*pvoid        //错误

要想解引用一个指针,或者使用“->”运算符复引用一部分,都要有对于指针指向的内存的解释规则。
反过来
例如,int *p;
那么,当你后面解引用p的时候,编译器就会把从p指向的首地址开始的四个字节看作一个整数的补码。
因为void指针只知道指向变量/对象的起始地址,而不知道指向变量/对象的大小(占几个字节)所以无法正确引用

2.4   如果函数的参数可以是任意类型指针,那么应声明其参数为void*。

典型的如内存操作函数memcpy和memset的函数原型分别为:

void*memcpy(void* dest,const void* src, size_t len);
void*memset(void*buffer,intc,size_tnum);

这样,任何类型的指针都可以传入memcpy和memset中,这也真实地体现了内存操作函数的意义,因为它操作的对象仅仅是一片内存,而不论这片内存是什么类型。如果 memcpy和memset的参数类型不是void*,而是char*,那是不具有普遍适用性的

最新文章

  1. Hackerrank11 LCS Returns 枚举+LCS
  2. servlet配置restful
  3. CSS初体验
  4. 如何使用 orachk 工具
  5. SqlServer 三级联动、递归表
  6. 实现Linux下的U盘(USB Mass Storage)驱动
  7. Asp.Net MVC页面静态化功能实现二:用递归算法来实现
  8. [codeforces631E]Product Sum
  9. C#使用Xamarin开发可移植移动应用进阶篇(9.混淆代码,防止反编译)
  10. JQuery的deferred对象学习总结
  11. [工作积累] UE4 TAA ReProjection的精度处理
  12. python六十八课——网络编程之UDP协议
  13. 【谈谈IO】BIO、NIO和AIO
  14. web安全之XSS注入
  15. java调用第三方的webservice应用实例【转载】
  16. C# Hadoop学习笔记(一)—环境安装
  17. RedHat 7.3 Oracle 12.2.0.1 RAC 安装手册(转)
  18. jquery 绑定文本即时查询功能
  19. webpack react 错误整理
  20. 2017 年度码云新增项目排行榜 TOP 50,为它们打“call”

热门文章

  1. windows上pip安装及使用详解
  2. ES6入门五:箭头函数、函数与ES6新语法
  3. vue进阶:vue-router(vue路由)的安装与基本使用
  4. phpstudycomposer thinkPHP5.1 使用
  5. Java 访问 C++ 方法:JavaCPP
  6. DA_04_解决Xshell中文乱码问题
  7. python模块、面向对象编程
  8. 执行nvidia-smi出错
  9. 生成静态libevent
  10. Easy UI 入门