我怎么能这样做:
char a[] = {1, 2};
char b[] = {3, 4, 5};
const char *r[] = {
a, b
};
但我不能这样做:
const char *r[] = {
{1,2}, {3,4,5}
};
是否有任何快捷方式可以初始化指向不同长度数组的指针数组?
答案 0 :(得分: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 :: array是一种不好的做法。
编辑:
你可以做这个丑陋的黑客攻击(它编译,但我不知道会发射多少枚火箭)。
const char *r[] = { (const char[]){1,2}, (const char[]){1,2,3}};
答案 1 :(得分:1)
没有简单的解决方案来实现您正在寻找的语法:这些指针必须指向某些数组,并且这些数组必须具有足够的生命周期。
您可能希望它们是自动的,这意味着将它们声明为您所做的局部变量。
你可以通过动态分配来实现你想要的东西,即:
const char *r[] = {
new char[]{1,2}, new char[]{3,4,5}
};
...在这种情况下,数组将具有足够的生命周期,但是您在正确的时间负担delete[]
。不是真正的解决方案。
答案 2 :(得分:1)
第一种形式有效,因为当像这样使用时,每个数组的名称将转换为指针(指向其第一个元素)。由于转化结果为char *
,因此可以将其存储在char *
的数组中。
第二种形式不起作用,因为{1,2}
和{3,4,5}
是(初始化)数组,而数组不是指针。无法将一个未命名的数组(这些数组)隐式转换为指针。
第一种形式是初始化指针数组的唯一快捷方式,因此每个指针都指向数组的第一个元素。
通常最好使用标准容器(例如std::vector<std::string>
)并完全避免指针的复杂性(以及将数组名称转换为指针)。
答案 3 :(得分: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的指针数组。