*(void **)是什么意思?

时间:2014-10-08 18:01:12

标签: c++ c

我在程序中看到了一句话

void *tmp = ...
tmp =  *(void **)ptr2;

这句话是什么意思?

4 个答案:

答案 0 :(得分:3)

tmp =  *(void **)ptr2;

让我们一步一步。

void *

这是指向无效的指针。

void **

这是指针到指针的指针。

(void **)ptr2;

无论ptr2是什么,让我们把它转换为指针到指针的指针。

*(void **)ptr2;

让我们取消引用指向void的指针,产生一个指向void的指针。

tmp =  *(void **)ptr2;

将指针指向void tmp

答案 1 :(得分:1)

给定更多上下文(如果它是语法上有效且可编译的代码),解释会更清晰。

考虑:

int i = 10 ;                  // an object i
int* ptr = &i ;               // ptr = address of i
int** ptr2 = &ptr ;           // ptr2 = address of ptr

void* tmp = *(void**)ptr2;    // tmp = thing pointed to by ptr2,
                              //       which is ptr, which is in turn the address of i,
                              //       but without type information.

现在,在没有看到原始代码的情况下,原始代码中的语义意义是不可知的。

答案 2 :(得分:0)

对于需要将void*强制转换为函数指针的情况,这是推荐的解决方法。例如dlsym()函数。

引用手册页:

  

写作:cosine =(double(*)(double))dlsym(handle," cos");将   看起来更自然,但C99标准留下来自" void *"   函数指针未定义。下面使用的分配是   POSIX.1-2003(技术勘误1)解决方法;看基本原理   对于dlsym()的POSIX规范。

答案 3 :(得分:-1)

这意味着ptr2指向的内存位置中存储的值被视为内存位置,并由tmp引用。 当量:     tmp =(void *)* ptr2