【转】理解*(void**)
#include <stdio.h>
int main()
{
int *p;
int a = ;
unsigned long b = ;
p = &a;
printf("%d\n", *p);
printf("%p\n", &a);
printf("%d\n", &a);
printf("%d\n", (void*)b);
//printf("%d\n",*(void*)b);//被注释的一行,运行此行会提示错误
printf("%d\n", *(int*)b);
printf("%d\n", *(void**)b);
return ;
}
P 为指向整型变量的指针。将 a 的地址赋予 p ,打印出 *p (解引用,即取该地址的值)为 2 。
再打印出 &a ,即 a 地址,为 0012FF78 (参数 p 表示用指针的格式,即内存地址,打印出来)。
再打印出 &a 的地址的十进制数字为 1245048( 参数 d 表示为十进制 ) 。
定义一个整型变量 b ,赋值为 1245048 ( 即 unsigned long b=1245048;) 。如此, printf("%d/n",(void*)b); 表示:将 b 强制转换为一个指针,并打印出来。结果是 1245048 。
为什么如此呢?因为此时 b 虽然转换为一个指针,但 printf 的时候却没加上 * 号,故此没进行解引用(也即是取该地址的值),因而打印出来的仍然是该指针的值。(注意区别指针的值,和该指针指向的地址的值)
那么,加上 * 号进行解引用再打印出来,可否?实验结果不行,出现语法错误。大概因为 b 只是强制转换为指针,并没有指明是什么样类型(其实是 void 型)的指针。
那么,强制转换的时候便声明该指针类型,可以吗?可以看看 printf("%d/n",*(int*)b); ,将 b 强制转换为 int* 类型的指针,解引用成功,输出 2 。
最后来到我们的问题, *(void**)b 究竟是什么?相信看到这里你大概知道了。
(void**) 代表的是指向指针的指针,如此,先 (void**)b ,即,将 b 强制转换为指向指针的指针,然后再给它加上一个 * 解引用,如此,便取得了该指针指向的地址值,是2。(注:此时2表示的是一个地址值)
你可能会说,这里不也是声明为 void 型的指针了吗?这里行为什么上边不行呢?不,这里其实是不一样的。上边是void 型指针,本质即指针,而这里是 void 型的指针的指针,本质是指针的指针。 void 型指针,不知道指向的地址内容要怎么去引用它,而 void 型的指针的指针,却知道其指向的地址内容是一个地址。
当然,我们也可以 printf("%d/n",*(int**)b); 输出结果是一样的。因为指向指针的指针本来就是指针(恩,有点拗口),只要类型正确,决定该指针输出什么的是其指向哪里的值,而不是指针本身。
我们可以做个试验, printf("%d/n",*(int****)b); ,看起来很晕吧,将 b 转换为指向指针的指针的指针的指针,结果呢?一样都是 2 。
转自:http://blog.csdn.net/loveyaqin1990/article/details/40015731
【转】理解*(void**)的更多相关文章
- 深刻理解void,void*和sizeof关键字
void的字面值是“无类型”,void*则是"无类型指针".void*可以指向任何类型的数据.void几乎只有"注释"和限制程序的作用,因为从来没有人会定义一个 ...
- 深入理解void以及void指针的含义
void的含义 void即“无类型”,void *则为“无类型指针”,可以指向任何数据类型. void指针使用规范 ①void指针可以指向任意类型的数据,亦即可用任意数据类型的指针对void指针赋值. ...
- 深入理解C语言-深入理解void
void的字面意思是"无类型",void *则为"无类型指针",void *可以指向任何类型的数据 void含义 void几乎只有注释和限制程序的作用,定义一个 ...
- [转载]void及void*的深度剖析
void的含义 void即"无类型",void *则为"无类型指针",可以指向任何数据类型. void指针使用规范 ①void指针可以指向任意类型的数据,亦即可 ...
- void和void*
void的含义 void即“无类型”,void *则为“无类型指针”,可以指向任何数据类型. void指针使用规范①void指针可以指向任意类型的数据,亦即可用任意数据类型的指针对void指针赋值.例 ...
- void与void *
转载:http://blog.csdn.net/geekcome/article/details/6249151 void的含义 void即“无类型”,void *则为“无类型指针”,可以指向任何数据 ...
- 【转】 void与void*详解
void关键字的使用规则: 1. 如果函数没有返回值,那么应声明为void类型: 2. 如果函数无参数,那么应声明其参数为void: 3. 如果函数的参数可以是任意类型指针,那么应声明其参数为void ...
- C语言中void*详解及应用
void在英文中作为名词的解释为“空虚:空间:空隙”:而在C语言中,void被翻译为“无类型”,相应的void *为“无类型指针”.void似乎只有“注释”和限制程序的作用,当然,这里的“注释”不是为 ...
- (七)C语言中的void 和void 指针类型
许多初学者对C中的void 和void 的指针类型不是很了解.因此常常在使用上出现一些错误,本文将告诉大家关于void 和void 指针类型的使用方法及技巧. 1.首先,我们来说说void 的含义: ...
随机推荐
- bzoj1597/luogu2900 土地购买 (斜率优化dp)
首先按x从小到大排序,那么可得: f[i]=min{f[j]+x[i]*maxy[j+1..i]} 然而这样是$O(n^2)$的而且无法做优化. 然后我们考虑:如果对于某一点,存在另一点的x和y都比它 ...
- google gson
发现了google的gson,因为之前对于protocolbuf有一些了解,带着一些好奇心,我开始使用了gson. 经过比较,gson和其他现有java json类库最大的不同时gson需要序列化得实 ...
- Linux 常用命令——df, du, ln
1. df 列出文件系统的整体磁盘使用量 2. du 评估文件系统的磁盘使用量(常用在推估目录所占容量),也可以计算文件或文件夹大小 3. ln 创建实体连接(hard link) 或 符号连接(Sy ...
- ASP: Response 对象 错误 'ASP 0251 : 80004005' 解决办法
Response 对象 错误 'ASP 0251 : 80004005' 超过响应缓冲区限制 这种情况一般是因为需要输出的网页内容太大了,由于asp在输入内容到客户的浏览器上之前,会把需要输出的全部内 ...
- theano使用
一 theano内置数据类型 只有thenao.shared()类型才有get_value()成员函数(返回numpy.ndarray)? 1. 惯常处理 x = T.matrix('x') # t ...
- 2018.10.2浪在ACM 集训队第三次测试赛
2018.10.26 浪在ACM 集训队第三次测试赛 今天是暴力场吗???????可怕 题目一览表 来源 考察知识点 完成时间 A 1275 珠心算测试 NOIP 普及组 2014 暴力??? 201 ...
- Python Machine Learning-Chapter3
Chapter 3:A Tour of Machine Learning Classifiers Using Scikit-learn 3.1:Training a perceptron via sc ...
- 已以用户 NT AUTHORITY\SYSTEM 的身份执行。 对象 名称 'XXX' 包含的前缀超出了最大限值。最多只能有 2 个。
我写了一个存储过程,里面用到了链接服务器,需要把这台电脑上的数据传送到连接服务器上去 insert [链接服务器].[数据库].[dbo].[表名] 我的数据 这样的格式是完全没问题的,问题出在于我t ...
- Cloud9 开发环境部署
安装和部署 cloud9 云端开发环境 简介 Cloud9 是亚马逊发布的一款基于云端的开发环境. AWS Cloud9 是一种基于云的集成开发环境 (IDE),您只需要一个浏览器,即可编写.运行和调 ...
- Java入门系列(十二)Java反射
Why--指的是为什么做这件事,也既事物的本质. 反射之中包含了一个“反”的概念,所以要想解释反射就必须先从“正”开始解释,一般而言,当用户使用一个类的时候,应该先知道这个类,而后通过这个类产生实例化 ...