Один быстрый совет о указателях: если вы разыгрываете его, вы, вероятно, делаете что-то не так.
Что касается вашего вопроса. Я не уверен, что item
в вашей проблеме. В первой части вы уже узнали, как получить доступ к члену в вашем массиве. Вы можете просто использовать это:
void *get_item(Thing *c, int index)
{
return *(c->array + index); // or return c->array[index];
}
Если вам нужен адрес указателя в индексе:
void **get_item_cell(Thing *c, int index)
{
return c->array + index; // or return &c->array[index];
}
Во второй части вы не разыменовываете указатель (для опции +) или не берете адрес результата массива, поскольку он автоматически разыменовывает его.
EDIT:
Я думаю, что теперь я знаю, что вы хотите. У вас есть функция, аналогичная моей второй выше, но это:
void *get_item_cell(Thing *c, int index)
{
return (void *)(c->array + index);
}
Вы хотите разыменовать значение, возвращаемое этой функцией, и получить доступ к объекту. В этом случае вы можете безопасно использовать только вариант 4. Поскольку у вас нет индекса, вы не можете перейти в любую другую ячейку (вы не знаете, находитесь ли вы в конце массива или в начале - так что никаких сложений или вычитаний). Вы можете только исправить ошибку вышеупомянутой функции: приведите к void **
, а затем разыменуйте ее: *(void **)item
. Это даст вам void *
. Если вы хотите получить доступ к объекту, указанному в этой ячейке, вам также необходимо привести его к правильному типу: some_object_ptr *obj = *(void**)item
.