我怎麼就可以這樣做:聲明指針數組字符數組
char a[] = {1, 2};
char b[] = {3, 4, 5};
const char *r[] = {
a, b
};
但我不能做這種方式:
const char *r[] = {
{1,2}, {3,4,5}
};
是否有初始化數組任何捷徑指向不同長度數組的指針?
我怎麼就可以這樣做:聲明指針數組字符數組
char a[] = {1, 2};
char b[] = {3, 4, 5};
const char *r[] = {
a, b
};
但我不能做這種方式:
const char *r[] = {
{1,2}, {3,4,5}
};
是否有初始化數組任何捷徑指向不同長度數組的指針?
此代碼不起作用,
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}};
有沒有簡單的解決方案,以實現你要找的語法:這些指針必須在一些陣列點,而這些數組必須有足夠的壽命。
您可能希望它們是自動的,這意味着您將它們聲明爲局部變量。
您可以達到那種你想通過動態分配什麼,即:
const char *r[] = {
new char[]{1,2}, new char[]{3,4,5}
};
...在這種情況下,陣列將有足夠的壽命,但你有delete[]
荷蘭國際集團他們的負擔在正確的時間。並非真正的解決方案。
第一種形式的工作原理是,當像這樣使用時,每個數組的名稱被轉換爲指針(指向其第一個元素)。由於轉換結果爲char *
,因此可將其存儲在char *
的數組中。
第二種形式不起作用,因爲{1,2}
和{3,4,5}
是(數組的初始值),並且數組不是指針。一個未命名的數組(這些都是)不能隱式轉換爲指針。
第一種形式是初始化指針數組的唯一快捷方式,因此每個指針都指向數組的第一個元素。
通常情況下,您最好使用標準容器(例如std::vector<std::string>
),並避免指針(以及數組名稱向指針的轉換)的複雜性。
你不能寫:
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的指針數組。
等效會比較像'R [0] =「\ X01 \ X02 \ X03是immediade UB 「'。 – Jarod42
由於'{1,2}'不是指針爲'char'。 –
謝謝。對我最後一個問題的任何建議? – John
@SamVarshavchik:是的。所以他可以寫:'{「1,2」}' – Raindrop7