如何声明和初始化二维数组的字符串?

时间:2013-05-30 12:45:08

标签: c++ multidimensional-array declaration c-strings

我需要这样的东西

const char **nodeNames[] = 
{
    {"RootNode", "Reference", "Node_1", "Node_2", "Node_3"},
    {"RootNode", "Hips", "Node_1", "Node_2", "Node_3"},
    {"RootNode", "Heviest", "Node_1", "Node_2", "Node_3"},
};

但是在之前的声明中,我收到了一个错误。

我怎样才能在代码中引用它?

2 个答案:

答案 0 :(得分:3)

看起来你想要一个const char*的二维数组:

const char *nodeNames[][5] =
{                 // ^^ this dimension can be deduced by the compiler, the rest not
    {"RootNode", "Reference", "Node_1", "Node_2", "Node_3"},
    {"RootNode", "Hips", "Node_1", "Node_2", "Node_3"},
    {"RootNode", "Heviest", "Node_1", "Node_2", "Node_3"}
};

请注意,您需要明确指定除主要尺寸之外的所有尺寸。

这与字符的3D数组完全不同,因为字符串的大小不同。我相信您已经意识到这一点,并且您不会例如取消引用nodeNames[0][2][7],这将超出"Node_1"的结尾。

答案 1 :(得分:2)

取决于你想要的东西。这将为您提供一个2D数组字符串:

const char *nodeNames[][20] = 
{
    {"RootNode", "Reference", "Node_1", "Node_2", "Node_3"},
    {"RootNode", "Hips", "Node_1", "Node_2", "Node_3"},
    {"RootNode", "Heviest", "Node_1", "Node_2", "Node_3"},
};

这将为您提供一个指向字符串数组的指针数组。

const char *node1[] = {"RootNode", "Reference", "Node_1", "Node_2", "Node_3"};
const char *node2[] = {"RootNode", "Hips", "Node_1", "Node_2", "Node_3"};
const char *node3[] = {"RootNode", "Heviest", "Node_1", "Node_2", "Node_3"};

const char **nodeNames2[] = 
{
    node1,
    node2,
    node3,
};

请注意,两者略有不同,因为第一个存储在数组中(因此存在一个连续存储3 * 20个指向字符串的指针),其中第二个只将地址存储到第一个指针中。指针数组,反过来又指向字符串。没有连续的存储,只有三个指针。

在这两种情况下,指针可以是相同的值,因为三个实例"Node_1"可以由单个字符串表示。

对于正确的char数组:

const char nodeNames3[3][5][12] = 
{
    {"RootNode", "Reference", "Node_1", "Node_2", "Node_3"},
    {"RootNode", "Hips", "Node_1", "Node_2", "Node_3"},
    {"RootNode", "Heviest", "Node_1", "Node_2", "Node_3"},
};

将所有字符存储在连续内存中,即3 * 5 * 12字节。