2013-07-15 64 views
-5

我對指針短語的確切含義有疑問。關於指針使用的說明

我有以下方法:

myFunc(const void * p) 
{ 
    ... 
} 

而且它正被稱爲:

myStruct *st; 
... 
myFunc((char **)&st->arr); 

我與指針的經驗,但在這種情況下,我還是失去了所有這些指針並獲得鑄造.. 我可以得到一個關於這種情況如何工作的準確解釋嗎?

由於

+0

如果你在沒有演員的情況下調用你的函數,它就不起作用了? – Alexis

+0

這將有助於看到myStruct'的'定義什麼'myFunc'確實與傳遞給它的指針。 – Dai

+1

[參見本太(http://boredzo.org/pointers/) –

回答

1

這個接縫是質量差的代碼!也許並不危險,因爲const出現在原型中。

myFunc(const void * p)接受一個指向任何東西,const應該意味着它不會動它。

現在,st是一個指向myStruct,所以st->arrarr成員的值和&st->arrarr構件的存儲器地址。假設arr是一個數組,st->arr值已經是一個指針。

所以,(char**)可能是正確的類型&st->arr,它是一個指向的字符陣列。如果它是正確的類型,則不需要投射!

當您需要告訴編譯器將數據作爲另一個數據來處理時,您進行了投射。它將使意義,在這種情況下myFunc((const void *)&st->arr);

反正不會對myFunc的進一步信息,我相信,真正的程序員的意圖是myFunc((const void *) st->arr);

0

ST-> ARR的地址已經被轉換爲字符**(即在哪裏可以找到一個指向字符的地址)。 myFunc接受幾乎任何東西(void *),你必須小心地傳遞它知道如何處理的東西。

內部,myFunc的可以做這樣的事情:

struct myStruct{ 
    char* arr; 
}; 

void myFunc(const void* ptr){ 
    char** cPtr = (char**) ptr; 
    (*cPtr)[1] = ...; 
} 

int main() 
{ 
    struct myStruct s; 
    ... 

    myFunc((char **)&s.arr); 

    ... 
} 

但是,你應該注意到,這是非常不好的(如 「dangerouse」)代碼。

+0

你是一個C主題混合C++。 –

+0

感謝,那也只是爲了簡單起見,以書面形式雖然 –

+0

的例子,注意有一個'const',所以'(字符**)PTR;'是pottencialy危險! –

0

您所呼叫的方法myFunc的具有雙指針字符**和同樣,您正在使用const void * ptr。在C中,一個void指針可以容納其他指針類型,如(char */float */int */...),稍後我們可以在我們使用時對它們進行類型轉換。

所以這裏一個空指針能,能夠保持雙字符指針,你可以強制轉換的空指針雙字符指針以後像

char **tempPtr = (char **)p; 

這裏const修飾,使指針p爲常數數據指針,這意味着它不會改變它所指向的數據。