我在程序中看到了一句话
void *tmp = ...
tmp = *(void **)ptr2;
这句话是什么意思?
答案 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