我正在研究一个使用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
然后,在同一类的后面:
displayOptions () {
cout << &options; // outputs 0x61ff28 (slightly different address)
// any other modifier to options (as shown above) outputs nothing
我知道我应该一次只问一件事,所以我的最终问题是:我如何确切地初始化和显示2D数组的内容?
如果涉及到为什么我得到这个错误,为什么所有这些不同的变化"选项"打印相同的东西,为什么它改变当相同的变量在同一类的不同方法中使用?
数组的数组不同于指针的数组。在你的代码中,你的options
数组实际上是(指针数组的数组;不是开玩笑),而且可能是无意的。
为了更清楚地理解你的声明,把char *options[3][20]
带到cdecl.org(一个非常棒的学习声明语法的网站,值得收藏)给我们:
声明选项为指向char
的数组20的数组3
鉴于此,显示您要做的是以下之一:
- 声明一个包含三个指向常量字符串指针的数组。 声明一个包含三个
char[20]
的数组,并提供初始值。只有后者是数组的数组。前者是指向const char
数据的指针数组。
指向const
字符串的三个指针数组
字符串字面值是const
,应该这样处理。还要注意3
是可选的,因为它可以从初始化中推断出来:
char const *options[3] = {"text1", "text2", "text3"};
或
char const *options[] = {"text1", "text2", "text3"};
char
数组
不需要指针。您只需这样做(再次注意,3
是可选的,因为它同样可以从初始化器中推导出来):
char options[3][20] = {"text1", "text2", "text3"};
或
char options[][20] = {"text1", "text2", "text3"};
这两种方法最大的两个区别
- 一个是指针数组,另一个是
char
数组 - 对于前者,数组(指针)是可变的,但是字符串是而不是。对于后者,数组和字符串(
char
的数组)都是可变的。
您必须添加第二个索引。
所以得到"Text1"你使用options[0][0]
。(您创建了一个3x20的数组,并且只初始化了第一行)
初始化一个2D数组,你可以这样格式化它。顺便说一下,我应该查一下这个。基本的东西)
char *TwoD_example[x][y] = {a1,a2,a3, ...}, {b1, b2, b3, ...}, .....
编辑:忘了加大括号…
char *TwoD_example[x][y] = {{a1,a2,a3, ...}, {b1, b2, b3, ...}, .....}
您不需要创建一个类来初始化和显示2D数组的内容。
可以使用循环初始化数组:
int **options = new int*[row_number];
for(int i=0;i<row_number;i++){
options[i] = new int[col_number];
}
创建一个指针数组。还要记住,您应该使用delete
从堆中取消分配。
您可以访问2D数组以显示如下内容:
options[3][20]