2012-12-21 76 views
2

請你幫助我理解這一點。.cpp的指針和數組

我有一個需要 「焦炭*** argv的」 功能;

據我所知它是: 指針指向數組的指針指針

是這樣的: 「的char * ARR []」?

char xx1 = '1'; 
char xx2 = '2'; 
char *argv[] = {&xx1,&xx2}; 

然後我打電話給我的函數gtk_init(&的argc,argv的&);

而得到錯誤:

main.cpp:43:31: error: cannot convert ‘char* (*)[2]’ to ‘char***’ for argument ‘2’ to ‘void gtk_init(int*, char***)’ 

感謝您的任何幫助。

+0

關閉。 'char * arr []'是一個指向數組的指針,而不是指向數組的指針。 –

+0

用'pointer to'替換每個'*'。然後附加最左邊的類型。 –

+0

*** argv是指向指向指針的指針,這取決於這些指針中的內容可以是三維數組的同義詞。 – RonaldBarzell

回答

4

char***是一個「指針的指針的指針爲char」。根本沒有陣列參與。你的argv是一個「指向char的2指針數組」。你的陣列,argv,名稱將衰減到一個指針,在某些情況下它的第一個元素 - 這個指針會有char**型,或「指向字符指針」。

當你做&argv時,你會得到一個char* (*)[2],或者是一個「指向2個指向char數組的指針」的指針。這不是你想要的。這是因爲你正在使用數組的地址,而不是指針的地址。

此外,你將有問題的事實是,你在argv指針剛剛指向單一char S,不是null結尾的字符串。 gtk_init幾乎肯定會期望以空字符結尾的字符串。

所以你會怎麼做?試試這個:

char xx1[] = "1"; // Now these are null-terminated strings 
char xx2[] = "2"; 
char* argv[] = {xx1, xx2}; 
char** argvp = argv; // Use the fact that the array will decay 
gtk_init(&argc, &argv); // &argv will now be a char*** 

之所以使用數組的字符串是因爲我們需要char s到是非常量,但char* str = "hello";樣式聲明已經過時 - 它必須是const char*。但是,通過使用數組,字符串文本的內容被複制到我們的數組中,所以我們可以自由地將它設爲非const

gtk_init真的只是希望你你的主要功能argcargv參數傳遞給它,如下所示:?

int main(int argc, char* argv[]) 
{ 
    gtk_init(&argc, &argv); 
    // ... 
} 

現在你可以問:「但是爲什麼&argv現在允許argv是類型相同在問題中!爲什麼我們不能再次獲得指向數組的指針?「實際上,argv不是同一類型,儘管它看起來有多少。當你定義一個帶有數組參數的函數時,它實際上被轉換爲一個指針。所以main的定義等同於:

int main(int argc, char** argv); 

所以,當我們做&argv,我們是完全罰款,因爲它給了我們一個char***

由於@OmnipotentEntity在評論中說 - 你最好有一個很好的藉口,不要將main的參數傳遞給gtk_init

+2

還應當指出的是,'gtk_init'打算把你的主要的'argc'和'argv',所以除非你正在做一些特別的或怪異的,你應該只是傳遞那些。 – OmnipotentEntity

+0

@OmnipotentEntity您的評論是值得注意的。 :)編輯:其實,我會在編輯 –

+0

是我做怪異的東西。試圖從Haxe使用GTK,所以我將一些haxe函數綁定到cpp。 非常感謝,這工作。 – somerandomusername