甲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
真的只是希望你你的主要功能argc
和argv
參數傳遞給它,如下所示:?
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
。
關閉。 'char * arr []'是一個指向數組的指針,而不是指向數組的指針。 –
用'pointer to'替換每個'*'。然後附加最左邊的類型。 –
*** argv是指向指向指針的指針,這取決於這些指針中的內容可以是三維數組的同義詞。 – RonaldBarzell