C++中void和void*指针的含义 (指针类型的含义)
转载自: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*,那是不具有普遍适用性的
C++中void和void*指针的含义 (指针类型的含义)的更多相关文章
- void及void指针含义的深刻解析
http://blog.csdn.net/geekcome/article/details/6249151 ----------- void的含义 void即“无类型”,void *则为“无类型指针” ...
- 深入理解void以及void指针的含义
void的含义 void即“无类型”,void *则为“无类型指针”,可以指向任何数据类型. void指针使用规范 ①void指针可以指向任意类型的数据,亦即可用任意数据类型的指针对void指针赋值. ...
- (七)C语言中的void 和void 指针类型
许多初学者对C中的void 和void 的指针类型不是很了解.因此常常在使用上出现一些错误,本文将告诉大家关于void 和void 指针类型的使用方法及技巧. 1.首先,我们来说说void 的含义: ...
- C/C++语言void及void指针深层探索(转)
转自:http://www.lanou3g.com/blog/sort/SelfiOS/page/78 1.概述 许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一 ...
- 【转载】C/C++语言void及void指针深层探索
C/C++语言void及void指针深层探索 1.概述许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误.本文将对void关键字的深刻含义进行解说,并详述vo ...
- 不要伤害指针(5)--void和void指针详解
原文转载地址:http://blog.csdn.net/sunchaoenter/article/details/6587426 增加自己的想法,作为笔记. 1.概述 许多初学者对C/C++语言中的v ...
- 【转】void及void指针的深刻解析
void的含义 void即“无类型” ,void*则为“无类型指针”,可以指向任何数据类型,所以又叫做“通用指针”. void指针使用规范 ①void指针可以只想任意类型的数据,亦即可用任意数据类型的 ...
- void及void指针介绍【转】
本文转载自:http://blog.csdn.net/renren900207/article/details/20769503 void类型指针(如void *p)所指向的数据类型不是确定的,或者说 ...
- C++ Primer 学习笔记与思考_7 void和void*指针的使用方法
(一)void的含义 void的字面意思是"无类型",void差点儿仅仅有"凝视"和限制程序的作用,由于从来没有人会定义一个void变量,让我们试着来定义: v ...
随机推荐
- linux mint ubuntu 安装virtualbox
安装虚拟机:virtualbox 1.打开终端而且切换到root帐号,然后输入安装命令: apt-get install virtualbox 2.安装推荐的软件包:(必须安装这个包.不然看不到应用程 ...
- python与pip
python , pip 相关命令汇总 1) 在python3 下升级pip3 pip3 install --upgrade pip
- -parameters 参数的使用 解决 Feign PathVariable annotation was empty on param 0
在使用 FeignClient 如果参数没有给默认名字 @PathVariable("districtId") Long districtId 比如 @FeignClient(&q ...
- ubuntu18.04安装fcitx
fcitx安装比较麻烦,我每次安装都要费不少劲,每次装安之后都没有写日志记录下来,导致下次装的时候又手忙脚乱,所以这次一定要记录下来. 前因: 我本来用的是ibus,但是这个输入法好像有bug,我在编 ...
- ffmpeg处理视频命令
一:视频添加图片水印 ffmpeg -i a.mp4 -vf "movie=a.jpg[watermark];[in][watermark] overlay=main_w-overlay_w ...
- 利用 Monitor.TryEnter 来规避 .NET 线程死锁的源代码
在开发多线程的应用程序时,我们会大量用到 lock (...) {} 块.如果 lock 的对象比较多,非常容易发生死锁.死锁的发生很难预料,而且一旦发生在界面线程上,界面就不再刷新响和应用户输入:如 ...
- ueditor 去掉自动跟随内容的<p><br /></p>
//编辑器不能为空内容 if (domUtils.isEmptyNode(me.body)) { me.body.innerHTML = ''; ueditor.all.js 删除BR 如果还不行, ...
- 第六章·Logstash深入-收集java日志
1.通过Logstash收集java日志并输出到ES中 因为我们现在需要用Logstash收集tomcat日志,所以我们暂时将tomcat安装到Logstash所在机器,也就是db03:10.0.0. ...
- 渗透测试平台Vulnreport介绍与使用
渗透测试平台Vulnreport介绍与使用 在这篇文章中,我们将跟大家讨论一些关于渗透测试方面的内容,并给大家介绍一款名叫Vulnreport的新型开源工具,而这款工具将能够让任何场景下的渗透测试 ...
- linux基础—课堂随笔08_进程(转)
进程优先级 命令 pstree -p 显示各个子线程 ps 进程状态(process state) UNIX风格:ps -ef BSD风格:ps aux 还有用到o参数,选项显示定制的信息: pid. ...