#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**)的更多相关文章

  1. 深刻理解void,void*和sizeof关键字

    void的字面值是“无类型”,void*则是"无类型指针".void*可以指向任何类型的数据.void几乎只有"注释"和限制程序的作用,因为从来没有人会定义一个 ...

  2. 深入理解void以及void指针的含义

    void的含义 void即“无类型”,void *则为“无类型指针”,可以指向任何数据类型. void指针使用规范 ①void指针可以指向任意类型的数据,亦即可用任意数据类型的指针对void指针赋值. ...

  3. 深入理解C语言-深入理解void

    void的字面意思是"无类型",void *则为"无类型指针",void *可以指向任何类型的数据 void含义 void几乎只有注释和限制程序的作用,定义一个 ...

  4. [转载]void及void*的深度剖析

    void的含义 void即"无类型",void *则为"无类型指针",可以指向任何数据类型. void指针使用规范 ①void指针可以指向任意类型的数据,亦即可 ...

  5. void和void*

    void的含义 void即“无类型”,void *则为“无类型指针”,可以指向任何数据类型. void指针使用规范①void指针可以指向任意类型的数据,亦即可用任意数据类型的指针对void指针赋值.例 ...

  6. void与void *

    转载:http://blog.csdn.net/geekcome/article/details/6249151 void的含义 void即“无类型”,void *则为“无类型指针”,可以指向任何数据 ...

  7. 【转】 void与void*详解

    void关键字的使用规则: 1. 如果函数没有返回值,那么应声明为void类型: 2. 如果函数无参数,那么应声明其参数为void: 3. 如果函数的参数可以是任意类型指针,那么应声明其参数为void ...

  8. C语言中void*详解及应用

    void在英文中作为名词的解释为“空虚:空间:空隙”:而在C语言中,void被翻译为“无类型”,相应的void *为“无类型指针”.void似乎只有“注释”和限制程序的作用,当然,这里的“注释”不是为 ...

  9. (七)C语言中的void 和void 指针类型

    许多初学者对C中的void 和void 的指针类型不是很了解.因此常常在使用上出现一些错误,本文将告诉大家关于void 和void 指针类型的使用方法及技巧. 1.首先,我们来说说void 的含义: ...

随机推荐

  1. 洛谷 P3225 [HNOI2012]矿场搭建 解题报告

    P3225 [HNOI2012]矿场搭建 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤 ...

  2. pyinstaller模块使用

    目前pip install pyinstaller已经成熟 但是还是有一些坑,郁闷了好久,记一下注意点吧. 将py脚本打包成exe文件时,如果导入了非python自带库,则需要将导入的库从site-p ...

  3. 【洛谷P4054】计数问题

    题目大意:维护 N*M 个点,每个点有三个权值,支持单点修改,查询矩形区间内权值等于某个值的点的个数. 题解:矩阵可以看成两个维度,权值为第三个维度,为一个三维偏序维护问题.发现第三维仅仅为单点修改和 ...

  4. Android: 网络随时需要在3G和Wifi切换,网络程序需要注意

    平时,3G和WIFI 都开着的时候,Android默认使用Wifi,但现实环境中不可能到处都有wifi,所以手机会经常自动切换网络. 有的时候,手机一开始使用wifi上网,当进入待机后10-30分钟, ...

  5. poj 1904(强连通分量+完美匹配)

    传送门:Problem 1904 https://www.cnblogs.com/violet-acmer/p/9739990.html 参考资料: [1]:http://www.cnblogs.co ...

  6. Python协程笔记 - yield

    生成器(yield)作为协程 yield实际上是生成器,在python 2.5中,为生成器增加了.send(value)方法.这样调用者可以使用send方法对生成器发送数据,发送的数据在生成器中会赋值 ...

  7. scatter

    一.matplotlib.pyplot.scatter用来画散点图 import matplotlib.pyplot as plt import matplotlib as mpl mpl.rcPar ...

  8. 关于连接linux被拒

    一.scp被拒 在服务器A命令行使用scp往服务器B传输,如: scp -i id_rsa_125 file1 user01@IP:/home #ssh_exchange_identification ...

  9. shell函数与数组

    shell函数与数组 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.为什么要使用shell函数 简单的说函数的作用就是把程序里多次调用的相同的代码部分定义成一份,然后起个名字, ...

  10. zabbix3.x添加H3C网络设备详解

    zabbix3.x添加H3C网络设备详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 前言: 欢迎加入:高级运维工程师之路 598432640 相信大家在看我的文章之前,也看过其 ...