我對指針短語的確切含義有疑問。關於指針使用的說明
我有以下方法:
myFunc(const void * p)
{
...
}
而且它正被稱爲:
myStruct *st;
...
myFunc((char **)&st->arr);
我與指針的經驗,但在這種情況下,我還是失去了所有這些指針並獲得鑄造.. 我可以得到一個關於這種情況如何工作的準確解釋嗎?
由於
我對指針短語的確切含義有疑問。關於指針使用的說明
我有以下方法:
myFunc(const void * p)
{
...
}
而且它正被稱爲:
myStruct *st;
...
myFunc((char **)&st->arr);
我與指針的經驗,但在這種情況下,我還是失去了所有這些指針並獲得鑄造.. 我可以得到一個關於這種情況如何工作的準確解釋嗎?
由於
這個接縫是質量差的代碼!也許並不危險,因爲const
出現在原型中。
myFunc(const void * p)
接受一個指向任何東西,const
應該意味着它不會動它。
現在,st
是一個指向myStruct
,所以st->arr
是arr
成員的值和&st->arr
是arr
構件的存儲器地址。假設arr
是一個數組,st->arr
值已經是一個指針。
所以,(char**)
可能是正確的類型&st->arr
,它是一個指向的字符陣列。如果它是正確的類型,則不需要投射!
當您需要告訴編譯器將數據作爲另一個數據來處理時,您進行了投射。它將使意義,在這種情況下myFunc((const void *)&st->arr);
反正不會對myFunc的進一步信息,我相信,真正的程序員的意圖是myFunc((const void *) st->arr);
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」)代碼。
你是一個C主題混合C++。 –
感謝,那也只是爲了簡單起見,以書面形式雖然 –
的例子,注意有一個'const',所以'(字符**)PTR;'是pottencialy危險! –
您所呼叫的方法myFunc的具有雙指針字符**和同樣,您正在使用const void * ptr。在C中,一個void指針可以容納其他指針類型,如(char */float */int */...),稍後我們可以在我們使用時對它們進行類型轉換。
所以這裏一個空指針能,能夠保持雙字符指針,你可以強制轉換的空指針雙字符指針以後像
char **tempPtr = (char **)p;
這裏const修飾,使指針p爲常數數據指針,這意味着它不會改變它所指向的數據。
如果你在沒有演員的情況下調用你的函數,它就不起作用了? – Alexis
這將有助於看到myStruct'的'定義什麼'myFunc'確實與傳遞給它的指針。 – Dai
[參見本太(http://boredzo.org/pointers/) –