【转】理解*(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

posted @ 2017-08-06 18:29  阿玛尼迪迪  阅读(1408)  评论(0编辑  收藏  举报