(一)void的含义

void的字面意思是“无类型”,void差点儿仅仅有“凝视”和限制程序的作用,由于从来没有人会定义一个void变量,让我们试着来定义:

void a;

这行语句编译时会出错。提示“illegal use of type 'void'”。只是。即使void a的编译不会出错。它也没有不论什么实际意义。

void真正发挥的作用在于:

(1) 对函数返回的限定;

(2) 对函数參数的限定。

int f(void); equal to   int f();
void f();

(二)void*指针

C++提供了一种特殊的指针类型void*,它能够保存不论什么类型对象的地址。void*表明该指针与一地址值相关,可是不清楚在此地址上的对象的类型。

Void*指针仅仅支持几种有限的操作:

1.与还有一个指针进行比較

2.向函数传递void*指针或从函数中返回void*指针

3.给还有一个void*指针赋值

4.不同意使用void*指针操纵它指向的对象

因为其它指针都包括有地址信息。所以将其它指针的值赋给空类型指针是合法的。反之,将空类型指针赋给其它指针则不被同意,除非进行显式转换。

因此。void*的作用大致例如以下:

1. 传參:通用类型

能够作为函数模板。链表等參数的通用參数。

在使用时,仅仅须要强制类型转换就能够。

在WinSocket编程中。_beginthread()函数的參数就是使用void*的一个实例。

2.强制类型转换

有时候因为重载等的干扰,导致须要转换成void *,来进行取地址。

比如,(void *)obj.member。就能够取到member的地址;直接&(obj.member)取到的实际上是obj的開始地址。

3.指向0的地址

(void *)0,指向全是0的地址。相当于NULL。

非void类型显式转换为void类型表达式,用于避免一些代码静态检查工具的警告。

#include<iostream>
#include<string>
using namespace std;
int main()
{ double obj=3.14;
int a=7;
double *pd=&obj;
void *pv=&obj; //ok
pv=&a; //ok
(*pv)++; // error,不得操纵对象
int *ptr=&a;
void *p=ptr; //ok
ptr=p; //error,不能将空类型指针赋给其它指针
ptr=(int*)p; //ok,显式转换
return 0;
}

C++ Primer 学习笔记与思考_7 void和void*指针的使用方法的更多相关文章

  1. C++ Primer 学习笔记与思考_3 ---头文件那些事儿(extern)

    (一)extern在头文件里的使用方法 由于头文件包括在多个源文件里.而且变量的定义仅仅能出现一次,所以在头文件里. 仅仅能够声明不能够出现定义. 我们能够在头文件里用extern声明全局变量,这样在 ...

  2. C++ Primer学习笔记(三) C++中函数是一种类型!!!

    C++中函数是一种类型!C++中函数是一种类型!C++中函数是一种类型! 函数名就是变量!函数名就是变量!函数名就是变量! (---20160618最新消息,函数名不是变量名...囧) (---201 ...

  3. C++ Primer学习笔记(二)

    题外话:一工作起来就没有大段的时间学习了,如何充分利用碎片时间是个好问题. 接  C++ Primer学习笔记(一)   27.与 vector 类型相比,数组的显著缺陷在于:数组的长度是固定的,无法 ...

  4. C++ Primer 学习笔记_57_类和数据抽象 --管理指针成员

    复印控制 --管理指针成员 引言: 包括指针的类须要特别注意复制控制.原因是复制指针时.一个带指针成员的指针类 class HasPtr { public: HasPtr(int *p,int i): ...

  5. [C/C++] C++ Primer学习笔记

    记录下自己掌握不清楚的概念和用法... Day 1 endl:具有输出换行的效果,并刷新与设备相关联的缓冲区. 注:在调试程序过程中插入的输出语句都应刷新输出流,否则可能会造成程序崩溃,将会导致程序出 ...

  6. C++Primer学习笔记《2》

    数组是一种复合类型,由类型名+数组名+维度组成. 数组定义中的类型能够是C++基本内置类型.也能够是类类型的.数组元素的类型能够是除了引用类型以外的其它不论什么类型.没有全部的元素都是引用的数组. 数 ...

  7. C++ Primer 学习笔记_Chapter4 数组和指针–指针

    一.什么是指针? 指针与迭代器一样,指针提供对其所指对象的间接访问,指针保存的是另一个对象的地址: string s("hello"); string *ps = &s; ...

  8. mybatis学习笔记(四)-- 为实体类定义别名两种方法(基于xml映射)

    下面示例在mybatis学习笔记(二)-- 使用mybatisUtil工具类体验基于xml和注解实现 Demo的基础上进行优化 以新增一个用户为例子,原UserMapper.xml配置如下: < ...

  9. 转 Android学习笔记: 学习过程中碰到的一些问题及解决方法

    在学习Android开发的过程中遇到了不少的问题,所幸的是最终经过上网查询都得到了解决.现在将我在学习Android开发过程中遇到的一些问题及解决的方法整理如下. 1.R.java不能实时更新 问题描 ...

随机推荐

  1. 关于requirejs和grunt压缩合并是否矛盾

    requirejs主要是为了模块化开发,这样带来的好处不言而喻.但是分成多个js文件增加了请求数,那么就要用到合并压缩.合并压缩了原来的许多独立的js模块,那requirejs又是怎么冲压缩的文件中找 ...

  2. 【01】国内外git托管平台(总结by魔芋)

    [01]国内git托管平台介绍 01, github:代码协作平台,协同开发. 代码托管平台. git:项目版本控制系统 02, 最好的托管方式: github 关闭或小众的托管方式: geakit( ...

  3. oracle11gR2下scott用户以及表的建立

    目录 oracle11gR2下scott用户以及表的建立 找到系统带的sql文件(utlsample.sql) 根据SQL的内容操作 新建用户并授权 scott登录 表操作 查询表(使用pl/sql) ...

  4. js的undefined怎么判断

    window.undefined=window.undefined 如何理解呢?百度搜索:window.undefined=window.undefined 博客说是为了兼容老浏览器. 技巧: 调试时 ...

  5. redis介绍和安装(一)

    Redis介绍:redis是一个key-value存储系统. 和Memcached类似,它支持存储的value类型相对更多,包括 string(字符串). list(链表).set(集合).zset( ...

  6. python 字典 key 和value 互换

    这里是一个可能有用的通过字典解析实现的小技巧: 交换字典的键和值. >>> a_dict = {'a': 1, 'b': 2, 'c': 3} >>> {value ...

  7. HDU——1242Rescue(BFS+优先队列求点图最短路)

    Rescue Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  8. BZOJ 1879 [Sdoi2009]Bill的挑战 ——状压DP

    本来打算好好写写SDOI的DP题目,但是忒难了, 太难了,就写的这三道题仿佛是可做的. 生在弱省真是兴奋. 这题目直接状压,f[i][j]表示匹配到i,状态集合为j的方案数,然后递推即可. #incl ...

  9. angular中ng-repeat去重

    [html] view plain copy print?在CODE上查看代码片派生到我的代码片 <div ng-app="myApp" ng-controller=&quo ...

  10. Linux(7):用户管理

    用户管理 让一个脚本或命令开机自启动的方法: # 方法一: 把脚本放到 /etc/rc.local 中 # 方法二: 把脚本或命令通过 chkconfig 管理 # 如何让一个脚本被 chkconfi ...