C++ 如何声明和初始化二维字符串数组?
我需要这样的东西C++ 如何声明和初始化二维字符串数组?,c++,multidimensional-array,declaration,c-strings,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"}, }; 但是在前面的声明中,我得到了一个错误 我如何在代码中引用它呢?
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"},
};
但是在前面的声明中,我得到了一个错误
我如何在代码中引用它呢?看起来您需要一个二维数组
常量字符*
:
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字符数组的行为不同,因为字符串的大小不尽相同。我相信您已经意识到了这一点,例如,您不会取消引用
节点名称[0][2][7]
,这将超出“Node_1”
的末尾,看起来您需要一个二维数组常量字符*
:
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字符数组的行为不同,因为字符串的大小不尽相同。我相信您已经意识到了这一点,例如,您不会取消对
节点名称[0][2][7]
的引用,这将超出“Node_1”
的末尾,这取决于您想要什么。这将为您提供一个二维字符串数组:
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”
可能由单个字符串表示
对于正确的3D字符数组:
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字节 取决于你想要什么。这将为您提供一个二维字符串数组:
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”
可能由单个字符串表示
对于正确的3D字符数组:
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字节