声明char数组的指针数组

时间:2016-12-24 21:47:22

标签: c++ arrays

我怎么能这样做:

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

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

但我不能这样做:

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

是否有任何快捷方式可以初始化指向不同长度数组的指针数组?

4 个答案:

答案 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的指针数组。