如何正确使用void**指针?

in *_*eps 20 c void-pointers

我试图使用双void指针,但我对使用有点困惑.我有一个struct包含void **数组.

struct Thing{
    void ** array;
};

struct Thing * c = malloc (sizeof(struct Thing));
c->array = malloc( 10 * sizeof(void *) );
Run Code Online (Sandbox Code Playgroud)

所以如果我想为每个指针分配一个不同的对象并尝试检索该值

 // Option 1
 *(c->array + index) = (void *) some_object_ptr;

 // Option 2
 c->array[index] = (void *) some_object_ptr;
Run Code Online (Sandbox Code Playgroud)

然后,我有另一个功能,给(void *) item每个单元格,而不是some_object_ptr.

如果我想检索指向的值some_object_ptr,
我应该这样做

 function return type is 'void *' and takes argument 'void *'
 // Option 3 
 return (void**) item

 // Option 4
 return *((void**)item)?
Run Code Online (Sandbox Code Playgroud)

奇怪的是,当我使用数组时,数组下标方法我不能使用选项4,只有选项3; 当我使用时,*(c->array + index)我只能使用opt.4.而不是选择...

有人可以告诉我这件事吗?如果我做出任何无效的假设,那么请你纠正我吗?

Syl*_*sne 27

A void **只是指向具有未指定类型的内存的指针.你只能解除引用一次(因为你不能取消引用a void *).但是,除此之外,它基本上与任何其他指针类型一样.如果它对您有所帮助,请以与您相同的方式考虑它int *.

所以,在您的具体情况下,我们有:

void** array;
int arrayLen = 10;
array = (void**)malloc(arrayLen * sizeof(void*));

some_type_t* some_object_ptr;    
// The following two assignment are equivalent since in C,
// array[index] <=> *(array + index)
array[index] = (void*)some_object_ptr;
*(array + index) = (void*)some_object_ptr;
Run Code Online (Sandbox Code Playgroud)

然后array是指向整个数组*array的指针,而是指向第一个元素的指针,因为它等价于array[0].