【转】理解*(void**)
#include <stdio.h> int main() { int *p; int a = 2; unsigned long b = (unsigned long)((int *)&a); p = &a; printf("a的值=%d\n", *p); printf("a的地址=%p\n", &a); printf("b转为void*的值=%p\n", (void*)b); // printf("b转为void*后,取其指向的值=%d\n", *(void*)b); //被注释的一行,运行此行会提示错误 printf("将b转为int*指针后,取其指向的值=%d\n", *(int*)b); printf("将b转为指针的指针后,取其指向的值=%d\n", *(void**)b); return 0; }
输出:
a的值=2
a的地址=0x7ffed5de1abc
b转为void*的值=0x7ffed5de1abc
将b转为int*指针后,取其指向的值=2
将b转为指针的指针后,取其指向的值=2
(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
それでも私の大好きな人