c++中带有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

然后,在同一类的后面:

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]

相关内容

  • 没有找到相关文章

最新更新