2014-11-14 75 views
0

我對下面的代碼問題:店面地址信息

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

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

我可以簡單地改變語句下面?

baseptr = ptr->base; 

爲什麼它會投baseptrvoid **

+0

可能有一些接口需要'query()'來實現。我們可以獲得關於如何使用query()的信息嗎? – 2014-11-14 15:59:18

+0

不,你不能,因爲'*(void **)baseptr'與'baseptr'不是一回事。前者取消引用'baseptr'並將值存儲在它指向的內存中。後者不解除引用,而是將值(它恰好是一個指針)存儲在'baseptr'本身中。 – 2014-11-14 16:01:29

+0

@BillLynch timrau給出的例子就是它在代碼中的使用方式。感謝您的幫助。 – Lemon 2014-11-14 16:11:41

回答

3

看起來baseptr用作輸出參數。的query()則調用者應該是這樣的:

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

然後,base在調用函數可以被分配接收到的值。

如果你只寫baseptr = ptr->base;,那麼它是複製的basequery()被更新。 query()返回後,調用者中的指針根本不會更新。

0

你似乎在演員之前忽視了第一個*。它取消了指針baseptr的引用。這意味着,ptr-> base的值存儲在baseptr指向的地址,而不是baseptr的ITSELF。轉換髮生是因爲它告訴編譯器baseptr現在是指向另一個void指針的指針(即void指針ptr-> base)。