2014-11-14 4 views
0

У меня есть вопрос о следующем коде:Магазин

//Definition of base used in ptr 
void *base; 

int query(Win *ptr, void *baseptr) 
{ 
    *(void**) baseptr = ptr->base; 
    ... 
} 

Могу ли я просто изменить заявление к следующему?

baseptr = ptr->base; 

Почему бросить baseptr в void **?

+0

Вероятно, существует определенный интерфейс, который требуется для выполнения запроса(). Можем ли мы получить информацию о том, как используется 'query()'? –

+0

Нет, вы не можете, так как '* (void **) baseptr' - это не то же самое, что' baseptr'. Первые разыменования 'baseptr' и сохраняют значение в памяти, на которую указывает. Последнее не разыскивает его, вместо этого оно сохраняет значение (которое является указателем) в 'baseptr'. –

+0

@BillLynch пример, заданный timrau, - это именно то, как он используется в коде. Спасибо за помощь. – Lemon

ответ

3

Похоже, что baseptr используется как выходной параметр. Вызывающий query() должно выглядеть:

void *base = NULL; 
Win *win = something; 
int result = query(win, &base); 

Затем base в функции вызывающего абонента может быть назначено полученное значение.

Если вы просто пишете baseptr = ptr->base;, то это копия из baseвнутриquery() обновляется. После возврата query() указатель в вызывающем абоненте не обновляется вообще.

0

Вы, кажется, упустили первую * перед актерским составом. Он разыгрывает указатель baseptr. Это означает, что значение ptr-> base хранится по адресу, где baseptr POINTS TO, и NOT в baseptr ITSELF. Бросок происходит потому, что он сообщает компилятору, что baseptr теперь является указателем на другой указатель void (т. Е. Указатель void ptr-> base).

Смежные вопросы