2016-12-24 160 views
1

我怎麼就可以這樣做:聲明指針數組字符數組

char a[] = {1, 2}; 
char b[] = {3, 4, 5}; 

const char *r[] = { 
    a, b 
}; 

但我不能做這種方式:

const char *r[] = { 
    {1,2}, {3,4,5} 
}; 

是否有初始化數組任何捷徑指向不同長度數組的指針?

+1

由於'{1,2}'不是指針爲'char'。 –

+0

謝謝。對我最後一個問題的任何建議? – John

+0

@SamVarshavchik:是的。所以他可以寫:'{「1,2」}' – Raindrop7

回答

1

此代碼不起作用,

const char r[][] = {{1,2}, {3,4,5}}; 

失敗:

x86-64 gcc 5.1!!error: declaration of 'r' as multidimensional array 
must have bounds for all dimensions except the first 


修復它像這樣:

const char r[][3] = {{1,2}, {3,4,5}}; 


側面說明:這是一個壞練習在C++中使用類C數組使用std: :數組,如果你知道你的值在編譯時。


編輯:

你可以做到這一點醜陋的黑客(它編譯,但我不知道有多少火箭發射)。

const char *r[] = { (const char[]){1,2}, (const char[]){1,2,3}}; 
+0

是的,但是如果第二級長度不一樣呢?例如,一個char數組指針數組(不是字符串文字),其值在編譯時已知? – John

+0

我認爲你的第一種形式儘可能短,沒有辦法將它們結合起來。 – Barmar

+0

編輯中的子數組是C99複合文字,它們不存在於C++中。海灣合作委員會爲他們提供與擴展,但IIRC他們是臨時代替自動,這樣在嘗試訪問它們... – Quentin

1

有沒有簡單的解決方案,以實現你要找的語法:這些指針必須在一些陣列點,而這些數組必須有足夠的壽命。

您可能希望它們是自動的,這意味着您將它們聲明爲局部變量。

可以達到那種你想通過動態分配什麼,即:

const char *r[] = { 
    new char[]{1,2}, new char[]{3,4,5} 
}; 

...在這種情況下,陣列將有足夠的壽命,但你有delete[]荷蘭國際集團他們的負擔在正確的時間。並非真正的解決方案。

1

第一種形式的工作原理是,當像這樣使用時,每個數組的名稱被轉換爲指針(指向其第一個元素)。由於轉換結果爲char *,因此可將其存儲在char *的數組中。

第二種形式不起作用,因爲{1,2}{3,4,5}是(數組的初始值),並且數組不是指針。一個未命名的數組(這些都是)不能隱式轉換爲指針。

第一種形式是初始化指針數組的唯一快捷方式,因此每個指針都指向數組的第一個元素。

通常情況下,您最好使用標準容器(例如std::vector<std::string>),並避免指針(以及數組名稱向指針的轉換)的複雜性。

0

你不能寫:

const char *r[] = { {1,2}, {3,4,5} }; 

,因爲你不能寫:

r[0] = 1, 2, 3; // but you can r[0] = "1, 2, 3"; 

來初始化指針數組爲char,您可以:

const char *r[] = { 
    {"1,2"}, {"3,4,5"}}; 

因此R一個指向char的指針數組。

+1

等效會比較像'R [0] =「\ X01 \ X02 \ X03是immediade UB 「'。 – Jarod42