声明指针数组字符数组

问题描述:

我怎么就可以这样做:声明指针数组字符数组

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

此代码不起作用,

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

有没有简单的解决方案,以实现你要找的语法:这些指针必须在一些阵列点,而这些数组必须有足够的寿命。

您可能希望它们是自动的,这意味着您将它们声明为局部变量。

可以达到那种你想通过动态分配什么,即:

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

+1

等效会比较像'R [0] =“\ X01 \ X02 \ X03是immediade UB “'。 – Jarod42