C++ c+中带有二维数组的指针+;

C++ c+中带有二维数组的指针+;,c++,arrays,pointers,multidimensional-array,reference,C++,Arrays,Pointers,Multidimensional Array,Reference,我正在做一个简单的程序,它使用2D字符数组,但我认为我的理解是错误的,因为我得到了一些奇怪的结果。我创建了一个处理所有文本的类。我的构造函数如下所示: // I use char * <var_name> here, because it's what I've found while searching online, // but I'm honestly not sure what it *actually* results in in the context of a 2D

我正在做一个简单的程序,它使用2D字符数组,但我认为我的理解是错误的,因为我得到了一些奇怪的结果。我创建了一个处理所有文本的类。我的构造函数如下所示:

// I use char * <var_name> here, because it's what I've found while searching online,
// but I'm honestly not sure what it *actually* results in in the context of a 2D array
char *options[3][20] = {"text1", "text2", "text3"};
cout << x;
// this displays the same hex address (0x61fd20),
// whether x is options, options[0], *options, *options[0], &options or &options[0] - I have no idea why
options[3][20]
//我在这里使用char*,因为这是我在网上搜索时找到的,
//但老实说,我不确定它在2D数组的上下文中实际会产生什么结果
字符*选项[3][20]={“text1”、“text2”、“text3”};

您必须添加第二个索引

因此,要获取“Text1”,您可以使用
选项[0][0]
。(您制作了一个3x20数组,只初始化了第一行)

若要初始化二维数组,请按以下方式设置其格式。(顺便说一句,应该查一下基本资料)

编辑:忘记添加大括号

char *TwoD_example[x][y] = {{a1,a2,a3, ...}, {b1, b2, b3, ...}, .....}

不需要创建类来初始化和显示二维数组的内容

可以使用循环初始化阵列:

int **options = new int*[row_number];

for(int i=0;i<row_number;i++){
    options[i] = new int[col_number];
}

数组数组不同于指针数组。在您的代码中,您的
选项
数组实际上是两个数组(指针数组数组;不开玩笑),而且可能是无意中

为了更清楚地了解您的声明,将
char*options[3][20]
To(一个学习声明语法和值得收藏的最棒的网站)带给我们:

将选项声明为指向char的指针的数组20的数组3

鉴于此,您似乎正在尝试执行以下操作之一:

  • 声明一个由三个指向常量字符串的指针组成的数组
  • 声明一个由三个
    char[20]
    组成的数组,并提供初始值
其中只有一个(后者)是数组的数组。前者是指向常量
char
数据的指针数组

指向
const
字符串的三个指针数组

字符串文本是
const
,应该这样处理。另请注意,
3
是可选的,因为可以从初始化中推断:

char const *options[3] = {"text1", "text2", "text3"};

字符的数组
数组

不需要指针。您只需执行此操作(请再次注意,
3
是可选的,因为它同样可以从初始值设定项中推断):

这两种方法之间最大的区别是

  • 一个是指针数组,另一个是字符数组
  • 对于前者,数组(指针)是可变的,但字符串不是。对于后者,数组和字符串(char的数组)都是可变的

为什么不使用<代码> STD::String < /C>和一些标准C++容器?或者可能是boost的多维数组?在LHS上有一个2D指针数组和一个与LHS上的
const char*
的1D数组兼容的初始值设定项。现在还不清楚你为什么认为你需要2D,以及第一个维度的3号代表什么。你能澄清一下你想做什么吗?您是说您想要一个2D数组,但如上所述,您正在初始化一个1D数组。阿纳尔-阿纳尔希望更多地了解如何处理C++中的多维数组,而你是否需要一个数组指针数组呢?但如果我所做的是一种愚蠢的方式,我将坚持使用std::string路由things@bradimus我有几个句子需要在代码中重复使用几次。我的理解是,一个句子就像一个一维的字符数组,所以一组句子将是一个二维数组,我明白了,我认为char*options[3][20]={“text1”、“text2”、“text3”};将“text1”视为第一个字符数组,将“text2”视为第二个字符数组,等等。我确实查找了一些内容,但没有真正理解-谢谢,我想我现在明白了。对不起,我一直在找这个真的tricky@AlKnemeyer:你没有字符数组,你有指向字符的指针数组。@AlKnemeyer不用担心,指针会让人困惑……但正如Ben Voigt提到的,它不是2D字符数组,它是指向字符的2D指针数组。指针指向地址。在本例中,是指向字符的地址。如果您只是想要一个2D字符数组,并且没有理由使用指针,那么就去掉*键。但是如果你去掉*的话,你就不能用这种方式初始化它,因为你在里面放了字符串。您必须使用std:string而不是其他人提到的char。
options[3][20]
char const *options[3] = {"text1", "text2", "text3"};
char const *options[] = {"text1", "text2", "text3"};
char options[3][20] = {"text1", "text2", "text3"};
char options[][20] = {"text1", "text2", "text3"};