C++ Primer 学习笔记与思考_7 void和void*指针的用法
2015-08-18 10:21
435 查看
(一)void的含义
void的字面意思是“无类型”,void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,让我们试着来定义:
void a;
这行语句编译时会出错,提示“illegal use of type 'void'”。不过,即使void a的编译不会出错,它也没有任何实际意义。
void真正发挥的作用在于:
(1) 对函数返回的限定;
(2) 对函数参数的限定。
(二)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类型表达式,用于避免一些代码静态检查工具的警告。
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语言盲点笔记1
- 直接插入排序(C++实现)
- C语言 产生 1- 100万随机数,如果重复的话,能马上知道.
- C++中 map容器的介绍
- VC++深入详解——第15章:线程同步
- C++代码风格:关于左花括号位置的研究
- (C/C++学习笔记)函数模板加强
- char*数组(c类型字符串)和c++中的string的转换、字符串比较、char*数组等问题
- [C++11] 默认构造函数
- (C/C++学习笔记)泛型编程基础
- 转:C语言中如何将二维数组作为函数的参数传递
- C语言 在已知字符串中找最长单词
- C/C++ scanf 函数中%s 和%c 的简单区别
- HDOJ-2112-HDU Today(最短路)
- C语言的预处理器
- 【C语言连载二】--------选择结构、循环结构、跳转语句(附几个例子)
- 【C语言连载一 】----------C语言基础
- c++ string
- libstdc++.so.6: version `GLIBCXX_3.4.15' not found
- 【8-17】c++学习笔记01