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不能实时更新 问题描 ...
随机推荐
- django 常见过滤器
一.形式:小写 {{ name | lower }} 二.过滤器是可以嵌套的,字符串经过三个过滤器,第一个过滤器转换为小写,第二个过滤器输出首字母,第三个过滤器将首字母转换成大写 标签 {{ st ...
- C++类设计1(Class without pointer members)
class complex{ public: complex (double r = 0, double i = 0):re(r), im(i){} //inline complex& ope ...
- 【总集】C++ STL类库 vector 使用方法
介绍: 1.vector 的中文名为向量,可以理解为一个序列容器,里面存放的是相同的数据结构类型,类似于数组但与数组又有微妙的不同. 2.vector 采用的是连续动态的空间来存储数据,它是动态的数组 ...
- ImportError: No module named ‘MySQLdb'
1.APP未注册 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contentty ...
- iOS学习笔记14-网络(三)WebView
一.WebView WebView就是一个内嵌浏览器控件,在iOS中主要有两种WebView:UIWebView和WKWebView,UIWebView是iOS2之后开始使用,WKWebView是在i ...
- [BZOJ1594] [Usaco2008 Jan]猜数游戏(二分 + 并查集)
传送门 题中重要信息,每堆草的数量都不一样. 可以思考一下,什么情况下才会出现矛盾. 1.如果两个区间的最小值一样,但是这两个区间没有交集,那么就出现矛盾. 2.如果两个区间的最小值一样,并且这两个区 ...
- spring之Autowire
当使用spring为一个对象的属性注入时,通常使用xml文件的property元素和ref属性,但是我们也可以使用spring中的autowire进行注入 使用方法如下 <bean id=&qu ...
- Caffe的Solver参数设置
Caffe的solver参数设置 http://caffe.berkeleyvision.org/tutorial/solver.html solver是通过协调前向-反向传播的参数更新来控制参数优化 ...
- 【基础操作】FFT / DWT / NTT / FWT 详解
1. 2. 点值表示法 假设两个多项式相乘后得到的多项式 的次数(最高次项的幂数)为 $n$.(这个很好求,两个多项式的最高次项的幂数相加就得到了) 对于每个点,要用 $O(n)$ 的时间 把 $x$ ...
- Nastya Studies Informatics
Nastya Studies Informatics time limit per test 1 second memory limit per test 256 megabytes in ...