C++ Primer 学习笔记与思考_7 void和void*指针的使用方法
(一)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*指针的使用方法的更多相关文章
- C++ Primer 学习笔记与思考_3 ---头文件那些事儿(extern)
(一)extern在头文件里的使用方法 由于头文件包括在多个源文件里.而且变量的定义仅仅能出现一次,所以在头文件里. 仅仅能够声明不能够出现定义. 我们能够在头文件里用extern声明全局变量,这样在 ...
- C++ Primer学习笔记(三) C++中函数是一种类型!!!
C++中函数是一种类型!C++中函数是一种类型!C++中函数是一种类型! 函数名就是变量!函数名就是变量!函数名就是变量! (---20160618最新消息,函数名不是变量名...囧) (---201 ...
- C++ Primer学习笔记(二)
题外话:一工作起来就没有大段的时间学习了,如何充分利用碎片时间是个好问题. 接 C++ Primer学习笔记(一) 27.与 vector 类型相比,数组的显著缺陷在于:数组的长度是固定的,无法 ...
- C++ Primer 学习笔记_57_类和数据抽象 --管理指针成员
复印控制 --管理指针成员 引言: 包括指针的类须要特别注意复制控制.原因是复制指针时.一个带指针成员的指针类 class HasPtr { public: HasPtr(int *p,int i): ...
- [C/C++] C++ Primer学习笔记
记录下自己掌握不清楚的概念和用法... Day 1 endl:具有输出换行的效果,并刷新与设备相关联的缓冲区. 注:在调试程序过程中插入的输出语句都应刷新输出流,否则可能会造成程序崩溃,将会导致程序出 ...
- C++Primer学习笔记《2》
数组是一种复合类型,由类型名+数组名+维度组成. 数组定义中的类型能够是C++基本内置类型.也能够是类类型的.数组元素的类型能够是除了引用类型以外的其它不论什么类型.没有全部的元素都是引用的数组. 数 ...
- C++ Primer 学习笔记_Chapter4 数组和指针–指针
一.什么是指针? 指针与迭代器一样,指针提供对其所指对象的间接访问,指针保存的是另一个对象的地址: string s("hello"); string *ps = &s; ...
- mybatis学习笔记(四)-- 为实体类定义别名两种方法(基于xml映射)
下面示例在mybatis学习笔记(二)-- 使用mybatisUtil工具类体验基于xml和注解实现 Demo的基础上进行优化 以新增一个用户为例子,原UserMapper.xml配置如下: < ...
- 转 Android学习笔记: 学习过程中碰到的一些问题及解决方法
在学习Android开发的过程中遇到了不少的问题,所幸的是最终经过上网查询都得到了解决.现在将我在学习Android开发过程中遇到的一些问题及解决的方法整理如下. 1.R.java不能实时更新 问题描 ...
随机推荐
- HTML、CSS知识点总结_D
一,html+css基础 1-1 Html和CSS的关系 学习web前端开发基础技术需要掌握:HTML.CSS.JavaScript语言.下面我们就来了解下这三门技术都是用来实现什么的: 1. HTM ...
- Puppet 安装配置
环境说明: OS:CentOS 5.4 i386 puppetmaster 192.168.0.12 hostname: puppetmaster.info.com client ...
- [uiautomator篇] 基类
package com.softwinner.performance.benchmark; /** * UiAssistant public class * @author liuzhipeng ...
- XML文件中<return_code><![CDATA[SUCCESS]]></return_code>中CDATA的用法
转义字符不合法的XML字符必须被替换为相应的实体. 如果在XML文档中使用类似"<" 的字符, 那么解析器将会出现错误,因为解析器会认为这是一个新元素的开始.所以不应该象下面 ...
- Cookie窃取实验
文章:IE/FIREFOX/CHROME等浏览器保存COOKIE的位置 Chrome的Cookie数据位于:%LOCALAPPDATA%\Google\Chrome\User Data\Default ...
- SG博弈函数模板
下面这两个模版应该就比较严密了,这个里边的f[]是从零开始的. 转载出处:转自:http://blog.csdn.net/primoblog/article/details/13376057 1.sg ...
- UIAlertView+Blocks.h
#import <Foundation/Foundation.h> typedef void (^DismissBlock)(int buttonIndex); typedef void ...
- tarkjan求无向图割点模板
#include<bits/stdc++.h> using namespace std; typedef long long ll; int n,m; ; ; struct node { ...
- CI(CodeIgniter)框架中的增删改查操作
我们创建一个模型( 项目目录/models/),请注意:模型名与文件名相同且必须继承数据核心类CI_Model,同时重载父类中的构造方法 CodeIgniter的数据函数类在 \models\User ...
- 洛谷 [P3150] pb的游戏
博弈论基础 本题可以视作P2148 E&D 的前置技能 本题直接判断奇偶性来求解, 证明就是2148 的证明 不贴代码